Problem mit Powershell-Script
Hallo, ich habe eine Frage zu einem Powershell-Script.
Es geht um die Umbenennung von Bild-Dateien (Endung jpeg) in einem Ordner.
Dieser Befehl wird nicht ausgeführt, die Dateien haben den selben Namen wie vorher.
der Ausschnitt:
ls $_.FullName -File -Filter *.jpeg | %{
rename-item $_.Fullname -NewName "${d}_Image$cnt$($_.Extension)" -Verbose
$cnt++
}
die Variable d hat den richtigen Inhalt, das habe ich mir mit write-host ausgeben lassen.
die Bilddateien sollen einen Namen nach der Vorschrift "yyyy-MM-DD_Imagexy.jpeg" erhalten, xy ist ein Zähler.
Könnte in der Zeile ein Fehler stecken?
Wie kann ich es testen?
Bin über Hinweise sehr dankbar.
Gruß
Alexander
Es geht um die Umbenennung von Bild-Dateien (Endung jpeg) in einem Ordner.
Dieser Befehl wird nicht ausgeführt, die Dateien haben den selben Namen wie vorher.
der Ausschnitt:
ls $_.FullName -File -Filter *.jpeg | %{
rename-item $_.Fullname -NewName "${d}_Image$cnt$($_.Extension)" -Verbose
$cnt++
}
die Variable d hat den richtigen Inhalt, das habe ich mir mit write-host ausgeben lassen.
die Bilddateien sollen einen Namen nach der Vorschrift "yyyy-MM-DD_Imagexy.jpeg" erhalten, xy ist ein Zähler.
Könnte in der Zeile ein Fehler stecken?
Wie kann ich es testen?
Bin über Hinweise sehr dankbar.
Gruß
Alexander
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 621095
Url: https://administrator.de/contentid/621095
Ausgedruckt am: 26.11.2024 um 07:11 Uhr
20 Kommentare
Neuester Kommentar
Dieser Befehl wird nicht ausgeführt, die Dateien haben den selben Namen wie vorher.
- Fehlermeldung?
- Dateien schreibgeschützt?
- Im Ordner liegen auch wirklich Dateien (Prüfen!) mit der Endung .jpeg und nicht *.jpg (ohne e)?
Da der Befehl mit -verbose versehen ist sollte zumindest eine Meldung erscheinen was der Umbenenn-Befehl macht. Wenn die Dateien schreibgeschützt sind dann hänge an den Rename-Item Befehl hinten mal ein -Force an.
Leider bringst du hier zu wenig Informationen. Die Befehls-Sequenz oben ist ansonsten ohne erkennbaren Fehler, aber leider vollkommen aus dem Kontext gerissen.
p.s. für die Zukunft: Code-Tags nutzen!
Wenn es tatsächlich Dateien in dem Ordner gibt dann muss dir zumindest eine Meldung angezeigt werden wenn es dort Dateien gibt, da der -Verbose Parameter gesetzt ist. Gibt es keine Meldung gab es dort auch keine Dateien.
Wenn du natürlich Dateien nur in Unterordnern dieses Ordners liegen hast dann musst du den Parameter -Recurse hinzufügen.
Aber anscheinend hast du dein Problem ja zwischenzeitlich schon gelöst, na denn bin ich wech ...
Wenn du natürlich Dateien nur in Unterordnern dieses Ordners liegen hast dann musst du den Parameter -Recurse hinzufügen.
ls $_.FullName -File -Filter *.jpeg -Recurse | %{
Wie könnte ich mir das Ergebnis von ( ls $_.FullName -File -Filter *.jpeg) auf dem Bildschirm ausgeben lassen?
Einfach alles hinter *.jpeg in der Pipeline weglassen und nur das vom obigen stehen lassenls $_.FullName -File -Filter *.jpeg
Aber anscheinend hast du dein Problem ja zwischenzeitlich schon gelöst, na denn bin ich wech ...
habe doch einen Denkfehler.
Joa, Denken kommt normalerweise vor dem Scheiben ...Und wie deine Ordnerstruktur jetzt tatsächlich aussieht sollen wir uns selbst zusammenreimen oder was??
ich denke, das Script sucht im Ordner, der "__" enthält (erste Ebene)
Nein es sucht in Ordnern (Zeile 10) die diesen Ordnern untergeordnet sind...$_.Fullname ist also offensichtlich falsch, hier müsste der Pfadname zur zweiten Ordner-Ebene stehen.
Die Variable bezieht sich nicht auf ein und das selbe sondern sie ist referenziert je nach Position einen Dateisystemeintrag der jewiligen Foreach-Schleife und hier laufen ja mehrere verschachtelte Schleifen!Ohne deine Ordnerstruktur zu kennen können wir hier leider nur die Glaskugel bowlen!
OK. Hab ich gerade mal testweise nachgestellt, klappt hier so wie du es beschreibst mit dem obigen Script problemlos. Wohl noch dein Denkfehler im Weg oder deine Beschreibung selbst hat einen grundlegenden Fehler .
Jepp die sind böse weil diese als Wildcard interpretiert werden, dafür musst du überall wo sie benutzt werden stattdessen den -LiteralPath statt dem -Path Parameter benutzen!
# Pfad bitte anpassen
$root = 'L:\Test'
$batch = 0
# Abfrage aller Ordner die '__' enthalten der ersten Ebene im Root-Ordner
ls -l $root -Directory | ?{$_.Name -match '__'} | %{
# alle 1000 Ordner anhalten und fragen
if ($batch % 1000 -eq 0){
Read-Host "`nEnter drücken zum fortfahren für die nächste Batch an Ordnern"
}
# Unterordner abfragen deren Namen dem Datumsmuster entspricht bsp: (2007Mrz09_Versuch)
ls -l $_.FullName -Directory | ?{$_.Name -match '^\d{4}[a-z]{3}\d{1,2}'} | %{
# Datum neu formatieren und an Variable übergeben
$d = [datetime]::ParseExact($matches,'yyyyMMMd',[cultureinfo]::GetCultureInfo('de')).toString('yyyy-MM-dd')
# Zähler initialisieren
$cnt = 1
# Alle *.jpeg Dateien des Ordners
ls -l $_.FullName -File -Filter *.jpeg | %{
rename-item -l $_.Fullname -NewName "${d}_Image$cnt$($_.Extension)" -Verbose
$cnt++
}
# Im Ordner enthaltene Dateien die keine JPEGs sind löschen
ls -l $_.FullName -File -Recurse | ? Extension -ne '.jpeg' | del -Force -verbose
# Ordner umbenennen auf Datum yyyy-MM-dd
rename-item -l $_.FullName -NewName $d -Verbose
}
# Ordner via Split mit '__' und letztem Token
rename-item -l $_.FullName -NewName $_.Name.split("__")[-1]
$batch++
}
Hier nicht, kopier das Skript nochmal.
Zeile 21 fehlt bei dir das -Recurse
Nöp, klappt hier einwandfrei . Ich bin jetzt raus eh schon zu viel Zeit hier vertrödelt ... Tschö.
Brings dir einfach selbst bei dann machst du dich nicht von anderen abhängig!
https://www.tutorialspoint.com/powershell/index.htm
Brings dir einfach selbst bei dann machst du dich nicht von anderen abhängig!
https://www.tutorialspoint.com/powershell/index.htm