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.
ich freue mich über Ideen. Ich gebe zu, ich habe Probleme, die Befehle zu verstehen.
Grüße und Danke
Alexander
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++
}
Grüße und Danke
Alexander
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 42776048692
Url: https://administrator.de/contentid/42776048692
Ausgedruckt am: 22.11.2024 um 14:11 Uhr
2 Kommentare
Neuester Kommentar
Moin Alexander,
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.
Du arbeitest doch nicht rekursiv, "$SUB.parent" ist somit gleich "$DIR". Auch hier sind die umschließenden runden Klammern obsolet.
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?
Gruß Thomas
Zitat von @alexander01:
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.Foreach ($SUB in ls $DIR.FullName -Directory | ?{$_.Name -match '(\d{1,2})\.(\d{1,2})\.(\d{4})'})
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)
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
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