Ich habe mehrere Konfigurationsdateien unter Windows Server 2008 wie folgt verschachtelt:
C:\Projects\Project_1\project1.config
C:\Projects\Project_2\project2.config
In meiner Konfiguration muss ich einen String wie folgt ersetzen:
<add key="Environment" value="Dev"/>
wird werden:
<add key="Environment" value="Demo"/>
Ich habe über die Verwendung von Batch-Skripten nachgedacht, aber es gab keine gute Möglichkeit, dies zu tun, und ich habe gehört, dass Sie dies mit PowerShell-Skripten problemlos durchführen können. Ich habe Beispiele für Suchen / Ersetzen gefunden, aber ich hatte gehofft, einen Weg zu finden, der alle Ordner in meinem Verzeichnis C: \ Projects durchläuft und alle Dateien findet, die mit der Erweiterung '.config' enden. Wenn es einen findet, möchte ich, dass es meine Zeichenfolgenwerte ersetzt.
Gibt es gute Ressourcen, um herauszufinden, wie dies funktioniert, oder PowerShell-Gurus, die Einblicke bieten können?
quelle
Antworten:
Hier ein erster Versuch auf meinem Kopf.
quelle
ls *.config -rec | %{ $f=$_; (gc $f.PSPath) | %{ $_ -replace "Dev", "Demo" } | sc $f.PSPath }
.
nach demls
. Ich bin selbst davon gestochen worden.PowerShell ist eine gute Wahl;) Es ist sehr einfach, Dateien in einem bestimmten Verzeichnis aufzulisten, zu lesen und zu verarbeiten.
Das Skript könnte folgendermaßen aussehen:
Ich habe den Code in mehrere Zeilen aufgeteilt, damit Sie ihn lesen können. Beachten Sie, dass Sie Set-Content anstelle von verwenden können
[IO.File]::WriteAllText
, aber am Ende eine neue Zeile hinzugefügt wird. Mit könnenWriteAllText
Sie es vermeiden.Andernfalls könnte der Code folgendermaßen aussehen :
$c | Set-Content $_.FullName
.quelle
Dieser Ansatz funktioniert gut:
quelle
Get-Content $_
mitGet-Content $_.FullName
, und das äquivalent fürSet-Content
dafür Dateien zu behandeln , die nicht an der Wurzel waren.Ich würde mit xml und xpath gehen:
quelle
Dieses Powershell-Beispiel sucht nach allen Instanzen der Zeichenfolge "\ foo \" in einem Ordner und seinen Unterordnern, ersetzt "\ foo \" durch "\ bar \" und schreibt keine Dateien neu, die die Zeichenfolge "\ foo \" nicht neu schreiben "Auf diese Weise zerstören Sie nicht die Datums- / Uhrzeitstempel der letzten Aktualisierung der Datei, bei denen die Zeichenfolge nicht gefunden wurde:
quelle
Ich fand den Kommentar von @Artyom nützlich, aber leider hat er keine Antwort gepostet.
Dies ist meiner Meinung nach die Kurzversion der akzeptierten Antwort.
quelle
foreach-object
anstelle des%
Alias zu verwenden . Andernfalls kann es zu folgendem Fehler kommen:Expressions are only allowed as the first element of a pipeline
Ich habe eine kleine Hilfsfunktion geschrieben, um Text in einer Datei zu ersetzen:
Beispiel:
quelle
Beim rekursiven Ersetzen müssen Pfad und Dateiname angegeben werden:
Dadurch werden alle "alten" durch "neue" ersetzt, wobei in allen Dateien Ihrer Ordner Ihres aktuellen Verzeichnisses zwischen Groß- und Kleinschreibung unterschieden wird.
quelle