Einen Powershell-Befehl bei Verwendung in einer Batchdatei auf mehrere Zeilen aufteilen?

Einen Powershell-Befehl bei Verwendung in einer Batchdatei auf mehrere Zeilen aufteilen?

Mit diesem Befehl können Sie Vorkommen von und OldText1in einer TXT-Datei durch und ersetzen , wenn der Befehl in einer Batchdatei in einer Zeile steht, wie folgt:OldText2OldText3NewText1NewText2NewText3

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) -replace 'OldText1', 'NewText1' -replace 'OldText2', 'NewText2' -replace 'OldText3', 'NewText3' | Set-Content $_.FullName}"

Wenn ich versuche, das Symbol zu verwenden ^, um den Befehl aufzuteilen (das funktioniert normalerweise in einer Batchdatei), funktioniert es nicht. Dies hier funktioniert beispielsweise nicht, in der txt-Datei wird nichts ersetzt:

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) ^
-replace 'OldText1', 'NewText1' ^
-replace 'OldText2', 'NewText2' ^
-replace 'OldText3', 'NewText3' ^
| Set-Content $_.FullName}"

Auch die Verwendung von Backticks funktioniert nicht (würde es aber nicht, da es sich hier nicht um ein PS1-Skript handelt):

start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) `
-replace 'OldText1', 'NewText1' `
-replace 'OldText2', 'NewText2' `
-replace 'OldText3', 'NewText3' `
| Set-Content $_.FullName}"

Ich habe den ganzen Morgen diesen Chatbot gefragt und er hat nichts gefunden, was funktioniert. Die Hälfte der Zeit schreibt er den Befehl immer wieder in eine Zeile und ich drehe mich damit nur im Kreis.

Ist es unmöglich, das zu tun, was ich versuche?

Der Grund, warum ich den Befehl auf mehrere Zeilen aufteilen möchte, ist einfach, dass ich lesen möchte, was ersetzt wird, ohne horizontal entlang des (und letztendlich) riesigen Befehls schauen zu müssen. Ich habe vor, noch viel mehr Ersetzungsbefehle als diesen hinzuzufügen, aber es funktioniert noch nicht einmal für drei Ersetzungsbefehle... noch nicht!

Vielen Dank im Voraus an alle, die wissen könnten, warum das nicht funktioniert.

Antwort1

Das ist mir nicht klar:

Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_)

Dieser Teil legt nahe, dass Sie Elemente in einem Ordner abrufen, und zwar genauer gesagt Elemente, die Dateien sind. Ihr Befehl definiert jedoch sofort eine Datei, in der die Zeichenfolgenersetzungen direkt im Inhalt vorgenommen werden.

Sehen Sie, durch das Entfernen dieses Teils kamen die Ersetzungen wie erwartet heraus, aber wenn dies für mehrere Dateien für dieselben Ersetzungen gilt, würde ich vorschlagen, die Frage zu bearbeiten. Obwohl es verwirrend ist, brauchen Sie für die Inhaltsverwaltung kein " Get-ChildItem 'Old and New text.txt' | ..." und können direkt verwendenGet-Content 'Old and New text.txt' ^|...

start "Start PS1/CMD" /wait /min PowerShell.exe -c  ^
"$Strings=Get-Content 'Old And New Text.txt' ^| %%  ^
   ^{ $_ -replace('OldText1','NewText1')^
         -replace('OldText2','NewText2')^
         -replace('OldText3','NewText3')^}^
  ; sc 'Old And New Text.txt' -Value $Strings -Force"

verwandte Informationen