alexander01
Goto Top

Hilfe nötig bei PowerShell-Script

Hallo,
ich hatte hier früher schon Hilfe bei der Erstellung eines Scriptes zur Umwandlung von Datei-Namen erhalten.
Eine Kleinigkeit funktioniert jedoch noch nicht, vielleicht kann mir auch hier jemand helfen.
Der Sachverhalt:
in einem Ordner gibt es einen oder mehrere Unterordner.
Auch diese enthalten wiederum Unterordner, diese enthalten Bild-Dateien, die umbenannt werden.

Das Script funktioniert perfekt, wenn es nur einen Unterordner gibt.
Gibt es jedoch mehr als einen, werden alle Dateien mit dem (umgeänderten) Namen des letzten Unterordners benannt.
Ich habe testweise mir per Echo-Befehl den Inhalt von Variablen ausgeben lassen und entdeckt, das das Problem in der Zeile mit der Deklarierung der Variablen $d oder vorab schon in der Zeile Roreach liegt. Die Variable $d wird nicht korrekt benannt sondern immer mit der Bezeichnung des letzten Unterordners.
Irgendwie muß es mit -match und / oder $matches[0] zu tun haben.

Foreach ($DIR in ls $root -Directory ) {
    # alle 5 Ordner anhalten und fragen
    if ($batch % 5 -eq 0){
        Read-Host "`nEnter drücken zum fortfahren für den nächsten Batch an Ordnern"  
    }
    # Unterordner abfragen deren Namen dem Datumsmuster entspricht
    Foreach ($SUB in ls $DIR.FullName -Directory | ?{$_.Name -match '(\d{1,2})\.(\d{1,2})\.(\d{4})'}) {  
        # Datum neu formatieren und an Variable übergeben 
        $d = [datetime]::ParseExact($matches[0],'M.d.yyyy',[cultureinfo]::InvariantCulture).toString('yyyy-MM-dd')  
        # neuen Ordner eine Ebene höher erstellen
        $newfolder = (Join-Path $SUB.Parent.FullName $d)
        md $newfolder -Force | out-null
        # Zähler initialisieren
        $cnt = 1
        # Alle *.tif Dateien des Unterordner "Images" in den neuen Ordner unter neuem Namen verschieben 
        Foreach ($FILE in ls "$($SUB.FullName)\Images" -File -Filter *.tif) {  
            move-item $FILE.Fullname -Destination "$newfolder\$DIR-$d-Image$cnt$($FILE.Extension)" -Verbose  
            move-item "$newfolder\$DIR-$d-Image$cnt$($FILE.Extension)" -Destination $ziel -Verbose  
            $cnt++
        }
        # alten Ordner rekursiv löschen
        del $SUB.FullName -Force -Recurse
    }
    # evt. Steuerdateien löschen
    ls $DIR.Fullname -File | del -Force

    $batch++
    }
ich freue mich über Ideen. Ich gebe zu, ich habe Probleme, die Befehle zu verstehen.
Grüße und Danke
Alexander

Content-ID: 42776048692

Url: https://administrator.de/contentid/42776048692

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

TK1987
Lösung TK1987 28.03.2024 aktualisiert um 09:27:31 Uhr
Goto Top
Moin Alexander,

Zitat von @alexander01:
Foreach ($SUB in ls $DIR.FullName -Directory | ?{$_.Name -match '(\d{1,2})\.(\d{1,2})\.(\d{4})'})  
die Überprüfung mit Where-Object erfolgt hier zuerst. Erst wenn diese abgeschlossen ist, werden die zutreffenden Zeilen verarbeitet. Die automatische Variable "$Matches" entspricht somit nur noch dem letzten Element, dass überprüft wurde. Mach die Überprüfung erst innerhalb der Foreach-Schleife.

BTW: Du hast im Regex Gruppen für Monat, Tag und Jahr gebildet, nutzt diese aber gar nicht - die runden Klammern kannst du also ebenso gut einfach weglassen.
Foreach ($SUB in ls $DIR.FullName -Directory) {
  if ($SUB.name -match "\d{1,2}\.\d{1,2}\.\d{4}") {  
    $d = [datetime]::ParseExact($matches[0],'M.d.yyyy',[cultureinfo]::InvariantCulture).toString('yyyy-MM-dd')  
    #...
  }
}

$newfolder = (Join-Path $SUB.Parent.FullName $d)
Du arbeitest doch nicht rekursiv, "$SUB.parent" ist somit gleich "$DIR". Auch hier sind die umschließenden runden Klammern obsolet.

move-item $FILE.Fullname -Destination "$newfolder\$DIR-$d-Image$cnt$($FILE.Extension)" -Verbose    
move-item "$newfolder\$DIR-$d-Image$cnt$($FILE.Extension)" -Destination $ziel -Verbose   
Du verschiebst die Datei zuerst in $newfolder und benennst sie Dabei um. Anschließend schiebst du sie von $newfolder in $ziel. Warum schiebst du die Datei nicht einfach gleich in $ziel und benennst sie dabei um?

Ich gebe zu, ich habe Probleme, die Befehle zu verstehen.
Dann solltest du diese Gelegenheit jetzt nutzen, indem du Fragen zu den Befehlen stellst, die du nicht verstehst.

Gruß Thomas
alexander01
alexander01 29.03.2024 um 08:49:14 Uhr
Goto Top
Danke, Thomas!
ich war gestern beruflich eingespannt, habe es dann abends umgesetzt. Es funktioniert! Ich habe auch deine Ausführungen verstanden.
Auch deine Hinweise zum Verschieben habe ich verstanden. Ich probiere mich mal an der Umgestaltung des Scriptes.
Nochmals Vielen Dank!
Grüße
Alexander