Categories
Virtual Log

Text in mehreren Dateien (in einem ganzen Verzeichnis) mit der Windows PowerShell ersetzen

Mit diesem praktischen Windows PowerShell-Skript kann man Text in einem ganzen Verzeichnis suchen und ersetzen.

Fotocredit: Microsoft

Windows PowerShell Hero

Als Entwickler gehört es fast zum Alltag häufig in einem ganzen Ordner nach Text zu suchen und diesen zu ersetzen. In den meisten Fällen wird das unter Windows vermutlich im Rahmen von Visual Studio erledigt, wenn man zum Beispiel eine Variable oder eine Funktion global umbenennen möchte.

Manchmal möchte man das aber auch auf Dateiebene in der Shell machen, was unter Linux zum Beispiel mittels find und sed schon seit Jahrzehnten praktiziert wird.

Unter Windows war das bis zur Einführung der PowerShell ein Krampf. Unter Windows 10 geht das Suchen und Ersetzen von Text aber auch auf der neuen Kommandozeile elegant vonstatten.

Das folgende PowerShell-Skript sucht im aktuellen Verzeichnis (.) und dessen Unterverzeichnissen (-rec) alle Textdateien (*.txt) nach dem Text "search" (RegEx) und ersetzt diesen durch "substitute". Die Dateien werden übrigens im -Raw Format geöffnet und der gesamte Inhalt inkl. Newlines ("\r\n") in einen String geladen, was theoretisch auch Ersetzungs-Operationen über mehrere Zeilen ermöglicht.

$files = Get-ChildItem . *.txt -rec
foreach ($file in $files)
{
(Get-Content -Raw $file.PSPath) -replace "search", "substitute" |
Set-Content $file.PSPath
}

Achtung: Bei rekursiven Skripten wie diesem hier, das Tausende Dateien gleichzeitig überschreiben kann, ist naturgemäß Vorsicht geboten, keinen Fehler zu machen. Daher empfehle ich, das Skript vorher in einem Testordner zu testen und/oder vorher ein Backup des eigentlichen Ordners, wo man die Operation ausführen möchte, zu erstellen.

Weitere Ressourcen

20.01.2020 Virtual Net

Kommentieren

Name
E-Mail (wird nicht veröffentlicht)
Homepage (optional)