Jump to content

Powershell-Script zum automatischen verschieben von Dateien anhand des Dateinamens


Go to solution Solved by testperson,

Recommended Posts

Hallo zusammen,

ich suche ein Skript, um Dateien anhand des Dateinamens bzw. Ordnernamens zu verschieben.

 

Mein Quellverzeichnis sieht folgendermaßen aus:

C:\Z_Messdaten\

-> Enthält diverse Dateien im Namensformat "AAA_BBBBB_YYMMDD_HHMM.zip" wobei A und B immer Zahlen sind.

-> Enthält einen Unterordner im Namen "BBBBB\hier_drin_liegen_diverse_Bilddateien"

 

Mein Zielordner soll folgendermaßen aussehen:

C:\Daten\AAA-BBBBB\Grunddaten\ --> Hier sollen alle entsprechenden .zip Dateien aus dem Quellverzeichnis rein.

C:\Daten\AAA-BBBBB\Bilder\ --> Hier sollen alle Bilddateien aus dem Quellverzeichniss Unterordner "BBBBB" rein

 

Also z.B. Quelldaten:

111_12345_YYMMDD.zip, 111_54321_YYMMDD.zip, 222_13579_YYMMDD.zip, [12345\hier_sind_bilddateien],  [54321\hier_sind_bilddateien],  [13579\hier_sind_bilddateien]

 

Diese sollen ins Ziel:

C:\Daten\111-12345\Grunddaten\[.zip]

C:\Daten\111-12345\Bilder\[alle Bilder vom 12345]

C:\Daten\111-54321\Grunddaten\[.zip]

C:\Daten\111-54321\Bilder\[alle Bilder vom 54321]

C:\Daten\222-13579\Grunddaten\[.zip]

C:\Daten\222-13579\Bilder\[alle Bilder vom 13579]

 

Habt ihr eine Idee für mich?

Ich schaffe es irgendwie nicht den Unterordner "BBBBB" zu erkennen und die Daten entsprechend dann in die Zielverzeichnisse einzusortieren :(

 

Danke für eure Hilfe im Voraus!

Liebe Grüße

Dennis

 

Link to post

Dennis, hallo und willkommen ... 

 

Weil wir irgendwann vermutlich sowieso dahin kommen  ... erzählst Du uns bitte gleich, woher die Daten kommen und warum sie neu in andere Ordner sortiert werden sollen?  

 

vor 2 Stunden schrieb Warlord205:
 

ich suche ein Skript, um Dateien anhand des Dateinamens bzw. Ordnernamens zu verschieben.

Du suchst .... !?  ... und wie wär's mit selber schreiben?  ;-) 

Zitat

Habt ihr eine Idee für mich?

ich würde damit anfangen, die Grundlagen von Powershell zu erlernen. 

Zitat

Ich schaffe es irgendwie nicht den Unterordner "BBBBB" zu erkennen und die Daten entsprechend dann in die Zielverzeichnisse einzusortieren :(

Was hast Du denn schon versucht?  ... und wo hast Du denn schon überall gesucht? Solche oder ähnliche Fragen wurden quer durchs Internet und auch hier schon gefühlt tausendfach gestellt und beantwortet.  Das letzte Mal ist hier im Forum - wie Martin schon oben bemerkt hat - nicht lange her.

 

Und es muss auch nicht immer ein Script sein ...  im oben bereits verlinkten Thread ist auch ein Hinweis auf das "Bulk Rename Utility" ... das kann sowas auch https://www.bulkrenameutility.co.uk/#mainscreen .

Edited by BOfH_666
Link to post

Hi,

 

aus dem verlinkten Thread solltest du dir deine Lösung ableiten können. Du hast es hier aber wesentlich einfacher, da deine Daten bereits mit einem einheitlichen Namensmuster bereitgestellt werden. Du kannst dir einfach nach und nach die ZIP-Files schnappen und am "_" den Dateinamen per "Split Methode" auseinander nehmen. Daraus kannst du dir dann deine neue Ordnerstruktur bauen und die Files verschieben.

 

Ansonsten zeig das vorhandene Script und wo es hakt, dann kann man weitersehen.

 

Gruß

Jan

Link to post
vor 8 Stunden schrieb BOfH_666:

Dennis, hallo und willkommen ... 

 

Weil wir irgendwann vermutlich sowieso dahin kommen  ... erzählst Du uns bitte gleich, woher die Daten kommen und warum sie neu in andere Ordner sortiert werden sollen?  

 

Du suchst .... !?  ... und wie wär's mit selber schreiben?  ;-) 

ich würde damit anfangen, die Grundlagen von Powershell zu erlernen. 

Was hast Du denn schon versucht?  ... und wo hast Du denn schon überall gesucht? Solche oder ähnliche Fragen wurden quer durchs Internet und auch hier schon gefühlt tausendfach gestellt und beantwortet.  Das letzte Mal ist hier im Forum - wie Martin schon oben bemerkt hat - nicht lange her.

 

Und es muss auch nicht immer ein Script sein ...  im oben bereits verlinkten Thread ist auch ein Hinweis auf das "Bulk Rename Utility" ... das kann sowas auch https://www.bulkrenameutility.co.uk/#mainscreen .

Hallo BOfH, danke für die nette Begrüßung!

 

Also zum Hintergrund der Daten:

Es sind Datenlogger die in diversen Fahrzeugen verbaut sind. Diese werden an einen zentralen Rechner via Ethernet ausgelesen und legen die Daten mit dem Namen AAA_BBBBB_YYMMDD_HHMM im .ZIP Format in dem "Messdaten" Verzeichnis ab. Der zentrale Rechner erstellt dann automatisch im Verzeichnis "Messdaten" einen Unterordner mit namen "BBBBB" in welchem aus der .ZIP datei automatisch bestimmte Dateien herausgesucht und entpackt werden.

Das AAA steht hier dreistellig für den Fahrzeugtyp. Das BBBBB steht immer fünstellig für die Fahrzeugnummer. A und B sind immer Zahlen vom 0-9.

 

Meine Ausgangs-Strucktur sieht also so aus:

| C:\Messdaten\(alle_.Zip_Dateien)

| C:\Messdaten\BBBBB\(alle_Bild+Log_Dateien)  <-- Jedes "Fahrzeug" bekommt seinen eigenen BBBBB Ordner, da die Dateinamen da drin bei allen Fahrzeugen gleich sind und nicht vermischt werden dürfen.

 

Das Zielverzeichniss sieht folgendermaßen aus:

 

| C:\Zielverzeichnis\YYMMDD\AAA-BBBBB\Messdaten\(hier_rein_sollen_alle_.zip_Dateien)

| C:\Zielverzeichnis\YYMMDD\AAA-BBBBB\Cut-Daten\(hier_rein_sollen_alle_Bild+Log_Dateien_aus_dem_Unterordner_BBBBB)

 

Das Skript muss also automatisch den Ordner BBBBB "einlesen" und diesen in den richtigen AAA-BBBBB Ordner verschieben.

 

(Hinweis an der Stelle, Die Fahrzeugnummer BBBBB ist immer unikat, es gibt sie also nicht doppelt für verschiedene Fahrzeugtypen:

Es kann keinen Ordner:  123-111111 und 321-11111 geben. BBBBB ist somit immer eindeutig.

 

Grundlagen von Powershell bin ich nebenbei am "lernen", komme aber mit den Anfänger Tutorials irgendwie nicht so recht auf die für mich scheinbar komplexe aufgabe.

 

Das BulkRenameUltility sieht für mich ehr aus als würde es Dateien umbennen und verschieben. Das ist jedoch nicht mein Ziel. Der Dateiname muss erhalten bleiben.

 

vor 37 Minuten schrieb testperson:

Hi,

 

aus dem verlinkten Thread solltest du dir deine Lösung ableiten können. Du hast es hier aber wesentlich einfacher, da deine Daten bereits mit einem einheitlichen Namensmuster bereitgestellt werden. Du kannst dir einfach nach und nach die ZIP-Files schnappen und am "_" den Dateinamen per "Split Methode" auseinander nehmen. Daraus kannst du dir dann deine neue Ordnerstruktur bauen und die Files verschieben.

 

Ansonsten zeig das vorhandene Script und wo es hakt, dann kann man weitersehen.

 

Gruß

Jan

 

Den Dateinamen der .ZIP Datei habe ich bereits "geschnitten" bekommen mit folgendem Code:

 

foreach($datei in $dateien){
#Fahrzeugtyp auslesen
$Typ = ($datei | Select-String -Pattern '\d+' -AllMatches).Matches.Value[0]
#Fahrzeugnummer auslesen
$Fahrzeugnummer = ($datei | Select-String -Pattern '\d+' -AllMatches).Matches.Value[1] 
}

 

Also Schritt 1 und Schritt 2 habe ich schon das "Initial Verzeichnis" ausgelesen in welchem die Script-Datei liegt und den Zielordner Auswahldialog eingefügt.

Das ist mein bisheriger Code, ab Schritt 3) hänge ich derzeit...

 

<# Die PowerShell Datei muss in Messdaten liegen (wo die Rohdaten auch liegen)
Unterordner cuted enthält Unterordner für alle Fahrzeuge (5-stellig)
In den 5-stelligen Fahrzeug ordnern liegen die Bearbeiteten-Traces



Programm:
1) Startverzeichnis ist Initial von Skript-Datei
2) Zielverzeichnis auswählen
3) Ordnername 5-stellig FINAS muss innerhalb des Ziel-Verzeichnis gesucht werden
4) Alle 5-stellig FINAS ordner daten müssen in jeweiliges Ziel-Verzeichnis einsortiert werden (move, not copy)
 #>
 
#Assembly für Forms laden
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

# 1)  Verzeichnis des PowerShell Programms einlesen und in $installpath speichern
function Get-ScriptDirectory {
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    Split-Path $Invocation.MyCommand.Path
}
$installpath = Get-ScriptDirectory
  
#Überprüfung ob richtiger Ordner erkannt:
	Write-Host "Ordner des Skripts ist $($installpath)" -ForegroundColor magenta

# 2) Zielverzeichnis auswählen
<# : Batch portion
@echo off
set "Start_Folder=1"
for /f "delims=" %%a in ('Powershell -nop -noni -c "iex (${%~f0} | out-string)"') do ( set "Program_Folder=%%a" )
if "%Program_Folder%"=="" ( cls & exit /b )
echo "%Program_Folder%"
pause
exit /b

: end Batch portion / begin PowerShell hybrid chimera #>
Function BuildDialog {
    $sourcecode = @"
using System;
using System.Windows.Forms;
using System.Reflection;
namespace FolderSelect
{
    public class FolderSelectDialog
    {
        System.Windows.Forms.OpenFileDialog ofd = null;
        public FolderSelectDialog()
        {
            ofd = new System.Windows.Forms.OpenFileDialog();
            ofd.Filter = "Folders|\n";
            ofd.AddExtension = false;
            ofd.CheckFileExists = false;
            ofd.DereferenceLinks = true;
            ofd.Multiselect = false;
        }
        public string InitialDirectory
        {
            get { return ofd.InitialDirectory; }
            set { ofd.InitialDirectory = value == null || value.Length == 0 ? Environment.CurrentDirectory : value; }
        }
        public string Title
        {
            get { return ofd.Title; }
            set { ofd.Title = value == null ? "Select a folder" : value; }
        }
        public string FileName
        {
            get { return ofd.FileName; }
        }
        public bool ShowDialog()
        {
            return ShowDialog(IntPtr.Zero);
        }
        public bool ShowDialog(IntPtr hWndOwner)
        {
            bool flag = false;
            if (Environment.OSVersion.Version.Major >= 6)
            {
                var r = new Reflector("System.Windows.Forms");
                uint num = 0;
                Type typeIFileDialog = r.GetType("FileDialogNative.IFileDialog");
                object dialog = r.Call(ofd, "CreateVistaDialog");
                r.Call(ofd, "OnBeforeVistaDialog", dialog);
                uint options = (uint)r.CallAs(typeof(System.Windows.Forms.FileDialog), ofd, "GetOptions");
                options |= (uint)r.GetEnum("FileDialogNative.FOS", "FOS_PICKFOLDERS");
                r.CallAs(typeIFileDialog, dialog, "SetOptions", options);
                object pfde = r.New("FileDialog.VistaDialogEvents", ofd);
                object[] parameters = new object[] { pfde, num };
                r.CallAs2(typeIFileDialog, dialog, "Advise", parameters);
                num = (uint)parameters[1];
                try
                {
                    int num2 = (int)r.CallAs(typeIFileDialog, dialog, "Show", hWndOwner);
                    flag = 0 == num2;
                }
                finally
                {
                    r.CallAs(typeIFileDialog, dialog, "Unadvise", num);
                    GC.KeepAlive(pfde);
                }
            }
            else
            {
                var fbd = new FolderBrowserDialog();
                fbd.Description = this.Title;
                fbd.SelectedPath = this.InitialDirectory;
                fbd.ShowNewFolderButton = false;
                if (fbd.ShowDialog(new WindowWrapper(hWndOwner)) != DialogResult.OK) return false;
                ofd.FileName = fbd.SelectedPath;
                flag = true;
            }
            return flag;
        }
    }
    public class WindowWrapper : System.Windows.Forms.IWin32Window
    {
        public WindowWrapper(IntPtr handle)
        {
            _hwnd = handle;
        }
        public IntPtr Handle
        {
            get { return _hwnd; }
        }

        private IntPtr _hwnd;
    }
    public class Reflector
    {
        string m_ns;
        Assembly m_asmb;
        public Reflector(string ns)
            : this(ns, ns)
        { }
        public Reflector(string an, string ns)
        {
            m_ns = ns;
            m_asmb = null;
            foreach (AssemblyName aN in Assembly.GetExecutingAssembly().GetReferencedAssemblies())
            {
                if (aN.FullName.StartsWith(an))
                {
                    m_asmb = Assembly.Load(aN);
                    break;
                }
            }
        }
        public Type GetType(string typeName)
        {
            Type type = null;
            string[] names = typeName.Split('.');
            if (names.Length > 0)
                type = m_asmb.GetType(m_ns + "." + names[0]);

            for (int i = 1; i < names.Length; ++i) {
                type = type.GetNestedType(names[i], BindingFlags.NonPublic);
            }
            return type;
        }
        public object New(string name, params object[] parameters)
        {
            Type type = GetType(name);
            ConstructorInfo[] ctorInfos = type.GetConstructors();
            foreach (ConstructorInfo ci in ctorInfos) {
                try {
                    return ci.Invoke(parameters);
                } catch { }
            }
            return null;
        }
        public object Call(object obj, string func, params object[] parameters)
        {
            return Call2(obj, func, parameters);
        }
        public object Call2(object obj, string func, object[] parameters)
        {
            return CallAs2(obj.GetType(), obj, func, parameters);
        }
        public object CallAs(Type type, object obj, string func, params object[] parameters)
        {
            return CallAs2(type, obj, func, parameters);
        }
        public object CallAs2(Type type, object obj, string func, object[] parameters) {
            MethodInfo methInfo = type.GetMethod(func, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            return methInfo.Invoke(obj, parameters);
        }
        public object Get(object obj, string prop)
        {
            return GetAs(obj.GetType(), obj, prop);
        }
        public object GetAs(Type type, object obj, string prop) {
            PropertyInfo propInfo = type.GetProperty(prop, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            return propInfo.GetValue(obj, null);
        }
        public object GetEnum(string typeName, string name) {
            Type type = GetType(typeName);
            FieldInfo fieldInfo = type.GetField(name);
            return fieldInfo.GetValue(null);
        }
    }
}
"@
    $assemblies = ('System.Windows.Forms', 'System.Reflection')
    Add-Type -TypeDefinition $sourceCode -ReferencedAssemblies $assemblies -ErrorAction STOP
}
#Ziel-Verzeichnis auswahl Dialog // Es muss das Datum gewählt werden wo die Dateien einsortiert werden sollen
    cd c: #THIS IS THE CRITICAL LINE
    BuildDialog
    $ziel = New-Object FolderSelect.FolderSelectDialog
    $ziel.Title = "Bitte wählen sie den Ordner des zugehörigen Tages in der TDS Ordnerstruktur aus";
    If ($env:Start_Folder -eq "1") {$ziel.InitialDirectory = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"};
    If ($env:Start_Folder -eq "2") {$ziel.InitialDirectory = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"};
    $ziel.ShowDialog() | Out-Null
    $ziel.FileName
      
	Write-Host "Gewähltes Zielverzeichnis ist $($ziel.FileName)" -ForegroundColor Yellow


# 3) Ordnername 5-stellig Fahrzeugnummer muss in Ziel-Verzeichnis gesucht werden



#Alle Dateien einlesen
#$QuellOrdner = ($Ziel1\cuted)
#	Write-Host "QuellOrdner ist $($QuellOrdner)" -ForegroundColor green
	

<# $ZielOrdner = $ziel.FileName;
	Write-Host "$ZielOrdner ist $($ZielOrdner)" -ForegroundColor green
$dateien = [System.IO.Directory]::GetFiles($QuellOrdner, '*.zip')
 #>
 
 
<# foreach($datei in $dateien){
#Fahrzeugtyp auslesen
$Typ = ($datei | Select-String -Pattern '\d+' -AllMatches).Matches.Value[0]
#Fahrzeugnummer auslesen
$Fahrzeugnummer = ($datei | Select-String -Pattern '\d+' -AllMatches).Matches.Value[1] 
#Fzg-Typ und Fahrzeugnummer mit Bindestrich verbinden
"$Typ-$Fahrzeugnummer"
 #>

 

 

Danke für eure Hilfe!

Grüße

Dennis

Edited by Warlord205
Link to post

Wow .... nachdem ich das gelesen hatte und auch versucht hatte, den Code zu verstehen, musste ich mich erstmal ne Weile sammeln und versuchen wieder geradeaus zu denken. ;-) Ich hab dann erstmal aufgegeben, zu versuchen, den Code zu verstehen.  :shock2: ;-)  Ich hab schon ne ganze Weile nicht mehr so ein unstrukturiertes Vorgehen gesehen.

 

vor 4 Stunden schrieb Warlord205:

Es sind Datenlogger die in diversen Fahrzeugen verbaut sind. Diese werden an einen zentralen Rechner via Ethernet ausgelesen und legen die Daten mit dem Namen AAA_BBBBB_YYMMDD_HHMM im .ZIP Format in dem "Messdaten" Verzeichnis ab. Der zentrale Rechner erstellt dann automatisch im Verzeichnis "Messdaten" einen Unterordner mit namen "BBBBB" in welchem aus der .ZIP datei automatisch bestimmte Dateien herausgesucht und entpackt werden.

Es wird also auf dem zentralen Rechner bereits eine Verarbeitung der Daten vorgenommen, richtig? Warum werden die Daten dort nicht "fertig" verarbeitet? Mit welchem Tool/Prozess werden die Daten dort vorverarbeitet? Warum wird dieser Prozess nicht dahingehend erweitert, dass das Ergebnis dem gewünschten entspricht.

 

Im Grunde geht es also darum, Dateien anhand ihrer Namensbestandteile in verschiedene Ordner zu verschieben, richtig? Dafür gibt es bereits mindestens hunderte Beispiele überall dort zu finden, wo man solche Fragen findet. Also PowershellGallery, StackOverflow, Powershell.org oder MSFT Technet ScriptGallery  usw.  ... oder eben sogar hier im Forum ... schonmal dort oder hier nach Beispielen gesucht?  ;-)   ... man muss das Rad ja nicht immer und immer wieder neu erfinden.

 

vor 4 Stunden schrieb Warlord205:

Das BulkRenameUltility sieht für mich ehr aus als würde es Dateien umbennen und verschieben. Das ist jedoch nicht mein Ziel. Der Dateiname muss erhalten bleiben.

Dazu noch ein Wort: Es haben sich also ziemlich schlaue Leute die Mühe gemacht, ein ziemlich aufwändiges Tool zu programmieren, um den Prozess des Umbenennens und Verschiebens von Dateien zu vereinfachen. Könnte es da nicht möglich sein, dass das Tool so flexibel gestaltet wurde, dass man eventuell einen der Schritte weglassen könnte, wenn man ihn grad mal nicht braucht? ... also z.B. man Dateien nur verschiebt und nicht umbenennt .....  ;-);-) Vielleicht lohnt sich ja doch ein zweiter etwas intensiverer Blick auf das Tool.

 

OK ... jetzt zum eigentlichen Problem ... die Daten liegen also unstrukturiert vor (ja, ich sehe, dass da ein Struktur existiert, aber die hilft uns nicht, weil wir sie nicht nutzbringend verwenden können.)

Wenn ich es richtig verstanden habe - Deine Erklärungen/Beispiele sind in diesem Punkt einigermaßen vage - haben alle Dateien, also sowohl die Zip-Dateien wie auch die Bild- und Log-Dateien, im Datei-Namen den Fahrzeugtyp, die Fahrzeugnummer, das Datum und die Zeit "codiert". Wie Du Dateinamen an den vorhandenen Trennzeichen aufsplittest, hast Du also schon gelernt. Dann brauchst Du doch jetzt nur noch die Bestandteile zu benutzen, um den gewünschten Zielordner zusammenzubauen. Also wenn das wirklich alles ist, sollte der folgende Schnipsel ausreichen ...

$SourceFolder = 'C:\Messdaten'
$TargetFolder = 'C:\Zielverzeichnis'

Get-ChildItem -Path $SourceFolder -File -Recurse |
ForEach-Object {
    $SplittedFileName = $_.BaseName -split '_'
    $CarType = $SplittedFileName[0]
    $CarNumber = $SplittedFileName[1]
    $Date = $SplittedFileName[2]
    if ($_.Extension -eq '.zip') {
        $Destination = 
        $TargetFolder, $Date, ($CarType + '-' + $CarNumber), 'Messdaten' -join '\'
        if(-not (Test-Path -Path $Destination -PathType Container)){
            New-Item -Path $Destination -ItemType Directory
        }
        Move-Item -Path $_.FullName -Destination $Destination
    }
    else {
        $Destination = 
        $TargetFolder, $Date, ($CarType + '-' + $CarNumber), 'Cut-Daten' -join '\'
        if (-not (Test-Path -Path $Destination -PathType Container)) {
            New-Item -Path $Destination -ItemType Directory
        }
        Move-Item -Path $_.FullName -Destination $Destination
    }
}

Wie immer .... bitte vorher mit Test-Daten testen und ich übernehme keine Garantie für gar nix.  :thumb1:

Edited by BOfH_666
  • Thanks 1
Link to post
vor einer Stunde schrieb BOfH_666:

Wow .... nachdem ich das gelesen hatte und auch versucht hatte, den Code zu verstehen, musste ich mich erstmal ne Weile sammeln und versuchen wieder geradeaus zu denken. ;-) Ich hab dann erstmal aufgegeben, zu versuchen, den Code zu verstehen.  :shock2: ;-)  Ich hab schon ne ganze Weile nicht mehr so ein unstrukturiertes Vorgehen gesehen.

Sorry!!! :D Wobei tatsächlich der größte Teil Code nur "reinkopiert" ist, das ist der Teil hinter "# 2) Zielverzeichnis auswählen" weil ich da einen, für meine Ansprüche sehr schönen FolderSelectionDialog" gefunden habe. Der ursprüngliche Code war nur:

#Quell-Ordnerwahl
$QuellOrdnerwahl = New-Object System.Windows.Forms.FolderBrowserDialog

Und da hat mich sehr gestört das ich immer wieder "MyComputer" starten musste und es keine Adress-zeile gab.

Wenn man den Schritt 2) rausnimmt, bleibt nicht mehr viel Code übrig :D

 

vor einer Stunde schrieb BOfH_666:

Im Grunde geht es also darum, Dateien anhand ihrer Namensbestandteile in verschiedene Ordner zu verschieben, richtig? Dafür gibt es bereits mindestens hunderte Beispiele überall dort zu finden, wo man solche Fragen findet. Also PowershellGallery, StackOverflow, Powershell.org oder MSFT Technet ScriptGallery  usw.  ... oder eben sogar hier im Forum ... schonmal dort oder hier nach Beispielen gesucht?  ;-)   ... man muss das Rad ja nicht immer und immer wieder neu erfinden.

Danke, da lese ich mich mal ein!

 

vor einer Stunde schrieb BOfH_666:

OK ... jetzt zum eigentlichen Problem ... die Daten liegen also unstrukturiert vor (ja, ich sehe, dass da ein Struktur existiert, aber die hilft uns nicht, weil wir sie nicht nutzbringend verwenden können.)

Wenn ich es richtig verstanden habe - Deine Erklärungen/Beispiele sind in diesem Punkt einigermaßen vage - haben alle Dateien, also sowohl die Zip-Dateien wie auch die Bild- und Log-Dateien, im Datei-Namen den Fahrzeugtyp, die Fahrzeugnummer, das Datum und die Zeit "codiert". Wie Du Dateinamen an den vorhandenen Trennzeichen aufsplittest, hast Du also schon gelernt. Dann brauchst Du doch jetzt nur noch die Bestandteile zu benutzen, um den gewünschten Zielordner zusammenzubauen. Also wenn das wirklich alles ist, sollte der folgende Schnipsel ausreichen ...

Da liegt mein kleines Problem aktuell.

Ich kann gerne meine Erklärungen weiter ausführen sofern das hilft, weiß leider nur nicht genau wie.

Der Fahrzeug-Typ und die Fahrzeugnummer sind leider  nur in den ".zip" enthalten. Nicht in den Bild- oder Log-Dateien.

Die Bild- oder Log-Dateien liegen Fahrzeugbezogen in einem Ordner, der den 5-stelligen Namen der Fahrzeugnummer trägt.

Erschwerend Hinzu kommt, das die Bild- und Log-Dateien für diverse Fahrzeuge den gleichen Namen tragen können. Sie lassen sich also nur an dem Ordner unterscheiden, in dem sie liegen.

 

Ich versuche mal mit dem Bild meine Ordnerstruktur aufzuzeigen:

 

image.thumb.png.cbcaa56753b36ef7b9a86d86ccce6010.png

 

Danke für deine Hilfe!

Grüße

Link to post
vor 1 Minute schrieb testperson:

Dafür kennt PowerShell "Expand-Archive". Zip entpacken, das Benötigte "zusammen bauen" und dann sortieren / verschieben.

Danke! Eine weitere .Zip Datei hilft mir in diesem Fall aber nicht. Ich benötige die Daten im Zielverzeichnis im gleichen Format wie im QuellVerzeichnis.

 

Wenn ich die Dateien "zusammenbauen" und wegsortieren kann, wonach ich sie wieder entpacken muss, könnte ich sie auch direkt so wegsortieren, oder?

 

Anbei noch meine Zielordnerstrucktur, falls das hilft:

 

image.thumb.png.36e76b2e2fe2ebb9a4fc9089e57b23e4.png

Link to post

Hmmm ... schade, dass Du nur einen Teil meiner Fragen beantwortest und schade, dass Du den Teil, den Du beantwortest, nur zum Teil beantwortest und weiterhin schade, dass wir uns jetzt doch wieder alle nötigen Einzelheiten mühsam zusammenklamüsern müssen. Und schade, dass mein Code-Beispiel überhaupt nicht kommentiert wurde. :nosmile:

 

vor 2 Stunden schrieb Warlord205:

Sorry!!! :D Wobei tatsächlich der größte Teil Code nur "reinkopiert" ist, das ist der Teil hinter "# 2) Zielverzeichnis auswählen" weil ich da einen, für meine Ansprüche sehr schönen FolderSelectionDialog" gefunden habe. Der ursprüngliche Code war nur:

Das heißt also, dass Du Code von irgendwo her holst und den ausführst, obwohl Du den vermutlich gar nicht verstehst und Dir auch nicht sicher sein kannst, dass er nur das macht, was Du möchtest.  ;-) 

 

vor 2 Stunden schrieb Warlord205:

Und da hat mich sehr gestört das ich immer wieder "MyComputer" starten musste und es keine Adress-zeile gab.

Ist der Quell- oder der Ziel-Ordner dynamisch? Also ändern sich diese Ordner immer wieder? Wenn nicht - wozu dann ein Auswahl-Dialog?

 

vor 2 Stunden schrieb Warlord205:

Ich kann gerne meine Erklärungen weiter ausführen sofern das hilft, weiß leider nur nicht genau wie.

Stell Dir einfach vor, Du musst es Deinem Opa erklären und er soll die Aufgabe erledigen. 

 

vor 2 Stunden schrieb Warlord205:

Der Fahrzeug-Typ und die Fahrzeugnummer sind leider  nur in den ".zip" enthalten. Nicht in den Bild- oder Log-Dateien.

Das ist aber eine essenzielle Info ... denkst Du das nicht auch? Sind den pro Fahrzeugnummer mehrere Fahrzeugtypen möglich? (Ja, ich meine das so herum) Ist die Unterscheidung nach dem Fahrzeugtyp in der Ordnerstruktur überhaupt nötig? Hat  das im Dateinamen codierte Datum bei den Zip-Dateien wirklich ein anderes Format als in den Bild- und Log-Dateien?? Deine Beschreibung und die Screenshots lassen das vermuten.  YYMMDD versus YYYYMMDD ???!!!

 

vor 2 Stunden schrieb Warlord205:

Ich versuche mal mit dem Bild meine Ordnerstruktur aufzuzeigen:

Hmmm ... Screenshots sind selten hilfreich, wenn es um Informationen geht, die auch textuell transportiert werden können.  Ein in eine Text-Datei exportiertes Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName ...  , einmal vom Quell- und einmal vom Ziel-Ordner wär wirklich hilfreich. Diese Dateien kannst Du hier posten.    

Und übrigens ...  die Ordnerstruktur sieht bei jeder neuen Antwort von Dir anders aus. Einmal sind die Log- und Bild-Dateien in BBBBB-Ordnern, dann wieder in cuted\BBBBB-Ordnern. Es würde helfen, wenn Du Dir erst mal selbst darüber klar wirst, was Du eigentlich genau möchtest.

 

 

Link to post
vor 1 Stunde schrieb BOfH_666:

Hmmm ... schade, dass Du nur einen Teil meiner Fragen beantwortest und schade, dass Du den Teil, den Du beantwortest, nur zum Teil beantwortest und weiterhin schade, dass wir uns jetzt doch wieder alle nötigen Einzelheiten mühsam zusammenklamüsern müssen. Und schade, dass mein Code-Beispiel überhaupt nicht kommentiert wurde. :nosmile:

 

Sorry! Ich dachte ich hätte die Fragen beantwortet, war nicht meine Absicht!

 

vor 6 Stunden schrieb BOfH_666:

 

Es wird also auf dem zentralen Rechner bereits eine Verarbeitung der Daten vorgenommen, richtig? Warum werden die Daten dort nicht "fertig" verarbeitet? Mit welchem Tool/Prozess werden die Daten dort vorverarbeitet? Warum wird dieser Prozess nicht dahingehend erweitert, dass das Ergebnis dem gewünschten entspricht.

Als Antwort auf die Frage: Die Datenverarbeitung auf dem Rechner wird automatisch mit der Software des Datenlogger-Lieferanten gemacht. Hier habe ich keinen Einfluss auf die "Weiterverarbeitung".

 

Das BulkRename Tool schaue ich mir aber im Detail noch mal an, versprochen.

 

vor 1 Stunde schrieb BOfH_666:

Das heißt also, dass Du Code von irgendwo her holst und den ausführst, obwohl Du den vermutlich gar nicht verstehst und Dir auch nicht sicher sein kannst, dass er nur das macht, was Du möchtest.  ;-) 

Ja zugegeben, teilweise ist das so... :(

 

vor 1 Stunde schrieb BOfH_666:

Ist der Quell- oder der Ziel-Ordner dynamisch? Also ändern sich diese Ordner immer wieder? Wenn nicht - wozu dann ein Auswahl-Dialog?

Ja. Das Quell-Verzeichnis ist in meinem Anwendungsfall das selbe Verzeichnis, in welchem auch das Skript liegen soll. Hier könnte ich auch damit leben wenn dieses "fix" wäre. Also immer C:\Messdaten.

 

Das Ziel-Verzeichnis ist dynamisch und muss zwingend nach Skript-Start auswahlbar sein.

 

vor 1 Stunde schrieb BOfH_666:

Das ist aber eine essenzielle Info ... denkst Du das nicht auch? Sind den pro Fahrzeugnummer mehrere Fahrzeugtypen möglich? (Ja, ich meine das so herum) Ist die Unterscheidung nach dem Fahrzeugtyp in der Ordnerstruktur überhaupt nötig?

Definitiv ist die Info essentiell! Daher hatte ich auch versucht sie in den Vorhergegangen Beschreibungen einzubringen, hat wohl nicht ganz geklappt mich richtig auszudrücken. Sorry!

Die Fahrzeugnummer BBBBB ist nicht doppelt vorhanden. Somit ist eine "Selektion" rein hieran möglich. Der Fahrzeugtyp ist lediglich im Zielverzeichnis relevant.

 

vor 1 Stunde schrieb BOfH_666:

Hat  das im Dateinamen codierte Datum bei den Zip-Dateien wirklich ein anderes Format als in den Bild- und Log-Dateien?? Deine Beschreibung und die Screenshots lassen das vermuten.  YYMMDD versus YYYYMMDD ???!!!

Ja der Dateiname nach dem FahrzeugTyp und der Fahrzeugnummer kann variieren. Dürfte aber nicht dramatisch sein, da ich ja nur die ersten beiden "Blöcke" heraussplitte oder?

Das Datum der ZIP oder LOG Datei ist beim verschieben nicht relevant. Ich muss lediglich nach "BBBBB" sortieren können.

 

vor 1 Stunde schrieb BOfH_666:

Hmmm ... Screenshots sind selten hilfreich, wenn es um Informationen geht, die auch textuell transportiert werden können.  Ein in eine Text-Datei exportiertes Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName ...  , einmal vom Quell- und einmal vom Ziel-Ordner wär wirklich hilfreich. Diese Dateien kannst Du hier posten.    

Anbei die Ausgabe:

C:\Z_Messdaten\cuted
C:\Z_Messdaten\111_02725_20201020_102357_20201020_160851.zip
C:\Z_Messdaten\124_01005_20201027_063138_20201027_135021_#1.zip
C:\Z_Messdaten\143_01007_20201024_063138_20201030_135021.zip
C:\Z_Messdaten\234_02726_20201004_110523_20201004_171029.zip
C:\Z_Messdaten\Hier_soll_das_skript_liegen.ps1
C:\Z_Messdaten\cuted\01005
C:\Z_Messdaten\cuted\01007
C:\Z_Messdaten\cuted\02725
C:\Z_Messdaten\cuted\02726
C:\Z_Messdaten\cuted\01005\EngTraces
C:\Z_Messdaten\cuted\01005\Offline_124_01005_Marker_#17_20201027_081741_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\01005\EngTraces\LOG_0021_20201027_081704_user.tar.gz
C:\Z_Messdaten\cuted\01005\EngTraces\LOG_0022_20201027_082839_user.tar.gz
C:\Z_Messdaten\cuted\01005\EngTraces\PIC_0021_20201027_081713_HU.png
C:\Z_Messdaten\cuted\01005\EngTraces\PIC_0022_20201027_082846_HU.png
C:\Z_Messdaten\cuted\01007\EngTraces
C:\Z_Messdaten\cuted\01007\Offline_143_01007_Marker_#05_20201025_083641_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\01007\EngTraces\LOG_0022_20201027_082839_user.tar.gz
C:\Z_Messdaten\cuted\01007\EngTraces\LOG_0025_20201207_081704_user.tar.gz
C:\Z_Messdaten\cuted\01007\EngTraces\PIC_0022_20201027_082839.png
C:\Z_Messdaten\cuted\01007\EngTraces\PIC_0025_20201207_081704.png
C:\Z_Messdaten\cuted\02725\EngTraces
C:\Z_Messdaten\cuted\02725\Offline_111_02725_Marker_#1_20201020_144905_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02725\Offline_111_02725_Marker_#2_20201020_145150_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02725\Offline_111_02725_Marker_#3_20201020_145911_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02725\Offline_111_02725_Marker_#4_20201020_155914_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02725\EngTraces\LOG_0002_20201107_051304_user.tar.gz
C:\Z_Messdaten\cuted\02725\EngTraces\PIC_0002_20201107_051304.png
C:\Z_Messdaten\cuted\02726\EngTraces
C:\Z_Messdaten\cuted\02726\Offline_234_02726_Marker_#92_20201004_135945_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02726\Offline_234_02726_Marker_#93_20201004_140023_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02726\Offline_234_02726_Marker_#94_20201004_140328_Timing_300_-_180_Konv.zip
C:\Z_Messdaten\cuted\02726\Offline_234_02726_Marker_#95_20201004_140443_Timing_300_-_180_Konv.zip
C:\Y_AusgabeOrdner\111-02725
C:\Y_AusgabeOrdner\124-01005
C:\Y_AusgabeOrdner\143-01007
C:\Y_AusgabeOrdner\234-02726
C:\Y_AusgabeOrdner\111-02725\Attachments
C:\Y_AusgabeOrdner\111-02725\CutTraces
C:\Y_AusgabeOrdner\111-02725\EngTraces
C:\Y_AusgabeOrdner\124-01005\Attachments
C:\Y_AusgabeOrdner\124-01005\CutTraces
C:\Y_AusgabeOrdner\124-01005\EngTraces
C:\Y_AusgabeOrdner\143-01007\Attachments
C:\Y_AusgabeOrdner\143-01007\CutTraces
C:\Y_AusgabeOrdner\143-01007\EngTraces
C:\Y_AusgabeOrdner\234-02726\Attachments
C:\Y_AusgabeOrdner\234-02726\CutTraces
C:\Y_AusgabeOrdner\234-02726\EngTraces

 

vor 2 Stunden schrieb BOfH_666:

Und übrigens ...  die Ordnerstruktur sieht bei jeder neuen Antwort von Dir anders aus. Einmal sind die Log- und Bild-Dateien in BBBBB-Ordnern, dann wieder in cuted\BBBBB-Ordnern. Es würde helfen, wenn Du Dir erst mal selbst darüber klar wirst, was Du eigentlich genau möchtest.

Sorry ich habe hier auf dem Rechner nur ein paar "Testdateien" mit denen ich rumbastle, eh ich an den richtigen Server gehe. Da ich das Ziel und Quellverzeichnis dynamisch erwartet hatte, war mir nicht bewusst das dies schlimm ist. Oben steht ja jetzt die "richtige" Ordnerstruktur.

 

vor 2 Stunden schrieb BOfH_666:

 Und schade, dass mein Code-Beispiel überhaupt nicht kommentiert wurde. :nosmile:

Das war keine Absicht, sondern da die LOG und PIC Dateien keine Fahrzeugnummer beeinhalten, funktioniert der Code so nicht ganz.

Wenn ich den bei mir laufen lassen, entstehen diverse Ordner die Daten "bekommen" welche nicht geplant waren. Zum Beispiel das "BBBBB" Ordner entstehen worin weitere Unterordner Offline-124 etc. entstehen.

Auszug meines "ZielVerzeichnisses" nach dem Anwenden auf C:\Messdaten:

C:\BOfH\01005
C:\BOfH\01007
C:\BOfH\02725
C:\BOfH\02726
C:\BOfH\20201004
C:\BOfH\20201020
C:\BOfH\20201024
C:\BOfH\20201027
C:\BOfH\20201107
C:\BOfH\20201207
C:\BOfH\Scripttest
C:\BOfH\01005\Offline-124
C:\BOfH\01005\Offline-124\Messdaten
C:\BOfH\01005\Offline-124\Messdaten\Offline_124_01005_Marker_#17_20201027_081741_Timing_300_-_180_Konv.zip
C:\BOfH\01007\Offline-143
C:\BOfH\01007\Offline-143\Messdaten
C:\BOfH\01007\Offline-143\Messdaten\Offline_143_01007_Marker_#05_20201025_083641_Timing_300_-_180_Konv.zip
C:\BOfH\02725\Offline-111
C:\BOfH\02725\Offline-111\Messdaten
C:\BOfH\02725\Offline-111\Messdaten\Offline_111_02725_Marker_#1_20201020_144905_Timing_300_-_180_Konv.zip
C:\BOfH\02725\Offline-111\Messdaten\Offline_111_02725_Marker_#2_20201020_145150_Timing_300_-_180_Konv.zip
C:\BOfH\02725\Offline-111\Messdaten\Offline_111_02725_Marker_#3_20201020_145911_Timing_300_-_180_Konv.zip
C:\BOfH\02725\Offline-111\Messdaten\Offline_111_02725_Marker_#4_20201020_155914_Timing_300_-_180_Konv.zip
C:\BOfH\02726\Offline-234
C:\BOfH\02726\Offline-234\Messdaten
C:\BOfH\02726\Offline-234\Messdaten\Offline_234_02726_Marker_#92_20201004_135945_Timing_300_-_180_Konv.zip
C:\BOfH\02726\Offline-234\Messdaten\Offline_234_02726_Marker_#93_20201004_140023_Timing_300_-_180_Konv.zip
C:\BOfH\02726\Offline-234\Messdaten\Offline_234_02726_Marker_#94_20201004_140328_Timing_300_-_180_Konv.zip
C:\BOfH\02726\Offline-234\Messdaten\Offline_234_02726_Marker_#95_20201004_140443_Timing_300_-_180_Konv.zip
C:\BOfH\20201004\234-02726
C:\BOfH\20201004\234-02726\Messdaten
C:\BOfH\20201004\234-02726\Messdaten\234_02726_20201004_110523_20201004_171029.zip
C:\BOfH\20201020\111-02725
C:\BOfH\20201020\111-02725\Messdaten
C:\BOfH\20201020\111-02725\Messdaten\111_02725_20201020_102357_20201020_160851.zip
C:\BOfH\20201024\143-01007
C:\BOfH\20201024\143-01007\Messdaten
C:\BOfH\20201024\143-01007\Messdaten\143_01007_20201024_063138_20201030_135021.zip
C:\BOfH\20201027\124-01005
C:\BOfH\20201027\LOG-0021
C:\BOfH\20201027\LOG-0022
C:\BOfH\20201027\PIC-0021
C:\BOfH\20201027\PIC-0022
C:\BOfH\20201027\124-01005\Messdaten
C:\BOfH\20201027\124-01005\Messdaten\124_01005_20201027_063138_20201027_135021_#1.zip
C:\BOfH\20201027\LOG-0021\Cut-Daten
C:\BOfH\20201027\LOG-0021\Cut-Daten\LOG_0021_20201027_081704_user.tar.gz
C:\BOfH\20201027\LOG-0022\Cut-Daten
C:\BOfH\20201027\LOG-0022\Cut-Daten\LOG_0022_20201027_082839_user.tar.gz
C:\BOfH\20201027\PIC-0021\Cut-Daten
C:\BOfH\20201027\PIC-0021\Cut-Daten\PIC_0021_20201027_081713_HU.png
C:\BOfH\20201027\PIC-0022\Cut-Daten
C:\BOfH\20201027\PIC-0022\Cut-Daten\PIC_0022_20201027_082839.png
C:\BOfH\20201027\PIC-0022\Cut-Daten\PIC_0022_20201027_082846_HU.png
C:\BOfH\20201107\LOG-0002
C:\BOfH\20201107\PIC-0002
C:\BOfH\20201107\LOG-0002\Cut-Daten
C:\BOfH\20201107\LOG-0002\Cut-Daten\LOG_0002_20201107_051304_user.tar.gz
C:\BOfH\20201107\PIC-0002\Cut-Daten
C:\BOfH\20201107\PIC-0002\Cut-Daten\PIC_0002_20201107_051304.png
C:\BOfH\20201207\LOG-0025
C:\BOfH\20201207\PIC-0025
C:\BOfH\20201207\LOG-0025\Cut-Daten
C:\BOfH\20201207\LOG-0025\Cut-Daten\LOG_0025_20201207_081704_user.tar.gz
C:\BOfH\20201207\PIC-0025\Cut-Daten
C:\BOfH\20201207\PIC-0025\Cut-Daten\PIC_0025_20201207_081704.png
C:\BOfH\Scripttest\BOfH-666
C:\BOfH\Scripttest\BOfH-666\Cut-Daten
C:\BOfH\Scripttest\BOfH-666\Cut-Daten\BOfH_666_Scripttest.ps1

 

Danke trotzdem für die Geduld mit mir :engel::dizzy:

 

Grüße

Dennis

Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...