alexander01
Goto Top

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

Content-ID: 621095

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

Ausgedruckt am: 26.11.2024 um 07:11 Uhr

SlainteMhath
SlainteMhath 10.11.2020 um 08:14:37 Uhr
Goto Top
Moin,

ls $_.FullName  ..
Welchen Wert hat denn hier $_.FullName ? Evtl. werden hier schon keine Files ausgewählt?

lg,
Slainte
alexander01
alexander01 10.11.2020 um 08:57:35 Uhr
Goto Top
Die Ausgabe Write-Host $_ erbrachte richtigerweise den verzeichnisnamen.
Gruß
Alexander
146189
Lösung 146189 10.11.2020 aktualisiert um 09:58:45 Uhr
Goto Top
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!
alexander01
alexander01 10.11.2020 um 10:12:10 Uhr
Goto Top
Danke für Meldung
Keine Fehlermeldung
Dateien nicht schreibgeschützt
Es sind jpeg-Dateien

Bin kein Script Fachmann
Wie könnte ich mir das Ergebnis von ( ls $_.FullName -File -Filter *.jpeg) auf dem Bildschirm ausgeben lassen?
Gruß und danke
Alexander
146189
146189 10.11.2020 aktualisiert um 10:41:04 Uhr
Goto Top
Zitat von @alexander01:
Keine Fehlermeldung
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.
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 lassen
ls $_.FullName -File -Filter *.jpeg

Aber anscheinend hast du dein Problem ja zwischenzeitlich schon gelöst, na denn bin ich wech ...
alexander01
alexander01 10.11.2020 aktualisiert um 12:37:07 Uhr
Goto Top
habe doch einen Denkfehler.
das Script sucht im falschen (übergeordneten) Ordner.

das Script (colinardo hatte mir hier geholfen) lautet:

$root = 'L:\Test'  
$batch = 0
# Abfrage aller Ordner die '__' enthalten der ersten Ebene im Root-Ordner 
ls $root -Directory | ?{$_.Name -match '__'} | %{  
    # alle 1000 Ordner anhalten und fragen
    if ($batch % 1 -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 $_.FullName -Directory -PipelineVariable dir | ?{$_.Name -match '^\d{4}[a-z]{3}\d{1,2}'} | %{  
        # Datum neu formatieren und an Variable übergeben
	    $d = [datetime]::ParseExact($matches,'yyyyMMMdd',[cultureinfo]::GetCultureInfo('de')).toString('yyyy-MM-dd')  
        # Zähler initialisieren
        $cnt = 1
        # Alle *.jpg Dateien des Ordners
        ls $_.FullName -File -Filter *.jpeg -Recurse | %{Rename-Item $_.FullName -Recurse -NewName "${d}_Image$cnt$($_.Extension)" -Verbose  
            $cnt++
        }
        # Im Ordner enthaltene Dateien die keine JPGs sind löschen
        ls $_.FullName -File -Exclude *.jpeg | del -Force
        # Ordner umbenennen auf Datum yyyy-MM-dd
        Rename-Item $_.FullName -NewName $d -Verbose
    }
    # Ordner via Split mit '__' und letztem Token 
    Rename-Item $_.FullName -NewName $_.Name.split("__")[-1]  
    $batch++
}

die Bilddateien liegen in den Ordnern, die dem Datumsmuster entsprechen.
ich denke, das Script sucht im Ordner, der "__" enthält (erste Ebene)
$_.Fullname ist also offensichtlich falsch, hier müsste der Pfadname zur zweiten Ordner-Ebene stehen. Wie macht man das?
Danke allen!
Gruß
Alexander
146189
146189 10.11.2020 aktualisiert um 13:47:12 Uhr
Goto Top
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!
alexander01
alexander01 10.11.2020 um 13:59:59 Uhr
Goto Top
Ok, ich sorge für Durchblick, danke erstmal für deine Hilfe!!
Ordnerstruktur:

L:\Test
in diesem Ordner (Test) liegen viele Unterordner, die alle ein "__" beinhalten. (erster Rang)
In jedem dieser Unterordner gibt es mindestens einen, manchmal mehrere Unterordner (zweiter Rang), dessen Namen analog "2007Mrz09_Versuch" (das Datum ist natürlich variabel) lautet.
in diesen Ordnern liegen die Bilddateien.

also z.B.

L:\Test\Ordner1__xyz\2008Jan15_Versuch\Image1.jpeg

das Script soll den Ordner ersten Ranges umbenennen (das klappt), den Ordner zweiten Ranges umbenennen (klappt nicht), die Dateinamen der Bilder umbenennen (klappt nicht) und alle nicht benötigten Dateien im Ordner wie die Bilder löschen (klappt nicht).

Ist das so ok?
Grüße
Alexander
146189
146189 10.11.2020 aktualisiert um 14:09:30 Uhr
Goto Top
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 face-wink.
alexander01
alexander01 10.11.2020 um 14:13:37 Uhr
Goto Top
verstehe ich nicht.

Fehlermeldung:
Rename-Item : Das Umbenennen ist nicht möglich, da das Element unter "L:\Test\Ordner1__7452\2006Okt09
Versuch__[0000137]" nicht vorhanden ist.
In C:\Users\user5\Desktop\MicroMaxx.ps1:23 Zeichen:9

back-to-topRename-Item $_.FullName -NewName $d -Verbose

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [Rename-Item], PSInvalidOperationException
+ FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.RenameItemCommand

Ordner 1 (Ordner1__7452) wird umbenannt in 7452 (korrekt)

Ordner 2 (2006Okt09 Versuch__[0000137]) wird nicht umbenannt, die Dateien in diesem Ordner sind unverändert.

Könnten die Klammern [ ] eine Rolle spielen?
146189
146189 10.11.2020 aktualisiert um 14:22:45 Uhr
Goto Top
Zitat von @alexander01:
Könnten die Klammern [ ] eine Rolle spielen?
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!
alexander01
alexander01 10.11.2020 um 14:25:58 Uhr
Goto Top
hilf mir bitte auf die Sprünge...
dieser Parameter muß also in den ls-Befehl integriert werden?
146189
146189 10.11.2020 aktualisiert um 17:51:54 Uhr
Goto Top
# 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++
}
alexander01
alexander01 10.11.2020 um 14:37:12 Uhr
Goto Top
jetzt hat sich was getan,

Fehlermeldungen:
keine

allerdings sind alle Dateien im Ordner 2. Ranges gelöscht. alles weg.
Die Bilddateien sollen umbenannt werden, alle nicht .jpeg-Dateien gelöscht werden.
der ordner 2. Ranges hat aber jetzt den richtigen Namen....
146189
146189 10.11.2020 um 14:40:54 Uhr
Goto Top
Hier nicht, kopier das Skript nochmal.
alexander01
alexander01 10.11.2020 um 14:42:48 Uhr
Goto Top
# Pfad bitte anpassen
$root = 'L:\test'  
$batch = 0
# Abfrage aller Ordner die '__' enthalten der ersten Ebene im Root-Ordner 
ls -LiteralPath $root -Directory | ?{$_.Name -match '__'} | %{  
    # alle 1000 Ordner anhalten und fragen
    if ($batch % 1 -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 -LiteralPath $_.FullName -Directory -PipelineVariable dir | ?{$_.Name -match '^\d{4}[a-z]{3}\d{1,2}'} | %{  
        # Datum neu formatieren und an Variable übergeben
	    $d = [datetime]::ParseExact($matches,'yyyyMMMdd',[cultureinfo]::GetCultureInfo('de')).toString('yyyy-MM-dd')  
        # Zähler initialisieren
        $cnt = 1
        # Alle *.jpg Dateien des Ordners
        ls -LiteralPath $_.FullName -File -Filter *.jpeg | %{Rename-Item -LiteralPath $_.FullName -NewName "${d}_Image$cnt$($_.Extension)" -Verbose  
            $cnt++
        }
        # Im Ordner enthaltene Dateien die keine JPGs sind löschen
        ls -LiteralPath $_.FullName -File -Exclude *.jpeg | del -Force
        # Ordner umbenennen auf Datum yyyy-MM-dd
        Rename-Item -LiteralPath $_.FullName -NewName $d -Verbose
    }
    # Ordner via Split mit '__' und letztem Token 
    Rename-Item -LiteralPath $_.FullName -NewName $_.Name.split("__")[-1]  
    $batch++
}
146189
146189 10.11.2020 aktualisiert um 14:44:05 Uhr
Goto Top
Zeile 21 fehlt bei dir das -Recurse
alexander01
alexander01 10.11.2020 um 14:49:29 Uhr
Goto Top
nachgetragen (auch in Zeile 16 ),
jedoch ist nach wie vor der Ordner leer, es wird alles gelöscht
146189
146189 10.11.2020 aktualisiert um 14:55:40 Uhr
Goto Top
Nöp, klappt hier einwandfrei face-smile. 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
alexander01
alexander01 10.11.2020 um 14:58:08 Uhr
Goto Top
vielleicht biste doch noch da.
mögliche (sichere?) Ursache: auch die Bilddatei-Namen enthalten Klammern und Punkte vor der Dateiendung .jpeg.