PowerShell Bulk Rename
Wer im gesamten Verzeichnisbaum Dateien umbenennen möchte, kann dies mit einem kurzen Skript tun oder unkompliziert eine einzige Zeile PowerShell verwenden, die dann die gesamte Arbeit erledigt.
We im gesamten Verzeichnisbaum zum Beispiel alle .jpeg Dateien in .jpg Dateien umbenennen möchte, findet im Web viele Beispiele, wie das geht. Oft haben sich die Autoren zwar schon Gedanken gemacht, aber nicht jeder möchte für diese simple Aufgabe ein mehrzeilliges Skript eingeben.
Mit PowerShell lässt sich das mit einer einzigen Zeile lösen:
Get-ChildItem "*.jpeg" -Recurse | Rename-Item -NewName { $_ .BaseName + ".jpg" } |
Diese Lösung ist einfach, erschließt sich dem PowerShell Gelegenheitsnutzer aber nicht auf den ersten Blick, denn wer von der Eingabeaufforderung kommt, würde diesen Befehl aus Gewohnheit wohl so eingeben:
Get-ChildItem "*.jpeg" -Recurse | Rename-Item -NewName $_ .BaseName + ".jpg" |
Bis auf das Klammerpaar {} sieht dieser Ausdruck ja identisch aus. PowerShell quitiert diese Nachlässigkeit des Admins allerdings mit einer sehr deutlichen Fehlermeldung:

Auch die Verwendung von Klammern () würde an dieser Stelle nicht weiterhelfen. Hier würde nur eine andere Fehlermeldung erscheinen und, noch viel schlimmer, die Dateien würden nicht korrekt umbenannt werden.
Aber warum ist das so? Rename-Item erwartet als Parameter NewItem zwar einen String, der zweifelsfrei in beiden Fällen angegeben wurde. Aber PowerShell wertet ohne Skript Block die angegebenen Parameter nacheinander aus und übergibt sie deshalb zu früh und damit auch falsch an den Parameter. Mit {} wird ein Skript Block definiert, der immer vollständig abgearbeitet wird, bevor dessen Ergebnis dann an den Parameter übergeben wird. Das wird dann als verzögerte Bindung bezeichnet.
Theoretisch könnte im Skript Block auch noch return angegeben werden, um den Rückgabewert zu definieren, dies ist aber in diesem Fall nicht zwingend notwendig.
Der Skript Block funktioniert nur, wenn das CmdLet seine Parameter über die Pipe bekommen hat. Wird der Skript Block als Parameter eingesetzt, ohne dass ein Piping stattgefunden hat, wirft PowerShell einen entsprechenden Fehler:

Wer mehr zu Skript Blöcken erfahren möchte, findet bei Microsoft in der PowerShell Dokumentation eine ausführliche Beschreibung zu diesem Thema.