Jump to content

Warlord205

Members
  • Gesamte Inhalte

    11
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von Warlord205

  1. vor 11 Stunden schrieb testperson:
    
    -Destination $("{0}\BP_CutTraces" -f $ZIP.DirectoryName) -Force

    wäre vermutlich einfacher. ;)

    Danke! hab ich eingearbeitet :)

     

    Eine kleine Frage ist mir heute aber bei der ersten Real-Anwendung noch gekommen.

    - Kann ich den Befehl "-Recurse" auf maximal eine Ordnerebene begrenzen?

     

    Wenn ich meinen Code anwende, wird jedes mal ein neuer Ordner "BP_CutTraces" angelegt und die ".zip" Files landen immer eine ebene Tiefer.

     

    Also das es nicht passiert das 2x "BP_CutTraces" untereinander erstellt wird?

     

    C:\Z_Messdaten\cuted\BBBBB\BP_CutTraces\[DATEI].zip

    und nicht:

    C:\Z_Messdaten\cuted\BBBBB\BP_CutTraces\BP_CutTraces\[DATEI].zip

    $SourcePath2 = "C:\Z_Messdaten\cuted\"
    
    if(Test-Path -Path $SourcePath2 -PathType Container){  #Überprüfung ob SourcePath ein realer Pfad ist?
        $ZIPFiles2 = Get-ChildItem -Path $SourcePath2 -Filter *.zip -Recurse #Alle Zip-Files einlesen
        #Write-Host $ZIPFiles2 -ForegroundColor DarkGreen
        
        foreach($ZIP in $ZIPFiles2){ #Für jede ZIP-Datei ausführen:
            #Write-Host $ZIP -ForegroundColor Cyan
    
            if(-not (Test-Path -Path $("{0}\BP_CutTraces" -f $ZIP.DirectoryName) -PathType Container)){
                New-Item -Path $("{0}\BP_CutTraces" -f $ZIP.DirectoryName) -ItemType Directory
            }
            $car = $ZIP.DirectoryName
            Get-ChildItem -Path $car -File -Filter *.zip |
                Move-Item -Destination $("{0}\BP_CutTraces" -f $ZIP.DirectoryName) -Force
        }
    } else{
        Write-Output "`"$SourcePath2`" nicht vorhanden!"   #Wenn SourcePath kein realer Pfad, Fehler ausgeben?
    }

     

    Danke!

     

  2. vor 5 Stunden schrieb testperson:

    Ich habe mal folgendes aus allem hier rausinterpretiert:

    
    $SourcePath = "C:\Install\Test\Z_Messdaten"
    $DestPath = "C:\Install\Test\Z_Ausgabeordner"
    
    if(Test-Path -Path $SourcePath -PathType Container){
        $ZIPFiles = Get-ChildItem -Path $SourcePath -File -Filter *.zip
    
        foreach($ZIPFile in $ZIPFiles){
            $tempPath = $ZIPFile.BaseName.Split("_")
            $curDestPath = $("{0}\{1}-{2}" -f $DestPath, $tempPath[0], $tempPath[1])
            if(-not (Test-Path -Path $curDestPath -PathType Container)){
                New-Item -Path $curDestPath -ItemType Directory
            }
            Get-ChildItem -Path $("{0}\cuted\{1}" -f $ZIPFile.DirectoryName, $tempPath[1]) |
                Copy-Item -Destination $curDestPath -Recurse -Force
        }
    } else{
        Write-Output "`"$SourcePath`" nicht vorhanden!"
    }

     

    Danke! Klappt perfekt!! Genau so sollte es sein @testperson  :bowing:

     

    Eine kleine Aufgabe habe ich aber noch.

     

    Kann ich in einem Ordner alle .Zip Dateien " eine Ebene nach unten" in einen neuen Ordner legen?

    Also ein "Source-Verzeichnis" mit mehreren Unterordnern nach .ZIP durchsuchen. Und diese innerhalb ihrer Strucktur in einen neuen Ordner reinlegen.

     

    Anbei ein Text-File Vorher- / Nachher-Vergleich

    Ordnerstrucktur_anpassen.txt

    Danke :)

     

     

  3. vor 11 Stunden schrieb BOfH_666:

    :rolleyes: .... als Datei-Anhang!!! 

     

    Du machst mich fertig. Und darauf habe ich keine Lust mehr. Mal sollen die Daten im Ziel-Ordner in Unterordnern mit Datumsformat sortiert sein, mal wieder nicht. Mal sollen im Quell-Ordner nur Zip-Dateien liegen, dann soll die Script-Datei im Quell-Ordner liegen. Dann sollen die Log- und Bild-Dateien in Unterordnern liegen, die die Fahrzeugnummer als Name haben, dann liegen sie aber offenbar in Unterordnern davon. So kann man nix automatisieren. Selbst wenn ich Dich bitte, eine Vorher- und Nachher-Beispiel-Datei-Struktur zu posten, kommt da nur wirrer Daten-Müll. Sowas macht mir schlechte Laune und das will ich nicht. Sorry, ich bin raus.

    Sorry es war nie meine Absicht euch hier unnötige Arbeit zu machen... Ich verstehe von der Materie garantiert noch nicht so viel wie Ihr, weshalb meine Rückmeldungen vielleicht nicht immer zufriedenstellend sind :(

     

    Im Grunde war mir die Quell-Ordnerstruktur auch nie wirklich wichtig. Ich will doch nur eine "Code-Zeile" die in der Lage ist, im Quellverzeichnis den Ordner "BBBBB" zu identifizieren. Und den gesamten Inhalt des Ordners "BBBBB" in den entsprechenden Ordner des Ziel-Verzeichnisses mit Namen AAA-BBBBB einzusortieren....

     

    Ich probiere einfach weiter rum. Danke trotzdem für deine Zeit, BOfH_666.

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

     

×
×
  • Neu erstellen...