Eine weitere Methode zur Verwendung von Powershell innerhalb von Batches zum Ersetzen von Zeichenfolgen

Eine weitere Methode zur Verwendung von Powershell innerhalb von Batches zum Ersetzen von Zeichenfolgen

Ich habe ein Batch-Skript erstellt, das Zeichenfolgen in einer angegebenen textbasierten Datei ersetzt. In meiner Datei OutDir=binsollte die Zeichenfolge ersetzt werden als OutDir=Build, wird aber als ausgegeben bin=OutDir=Build=bin. Wie kann ich das =in umgehen OutDir=bin, damit die Zeichenfolge nicht verstümmelt wird? Ich habe es versucht, OutDir^=aber die Verwendung des Carrot funktioniert auch nicht.

Hier ist mein aktuelles Skript:

@echo off 
    setlocal enableextensions disabledelayedexpansion

    set search=OutDir=bin
    set replace=OutDir=Build

    set textFile=%DOCUMENT%.txt

    for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        >>"%textFile%" echo(!line:%search%=%replace%!
        endlocal
    )

Ich habe versucht, die Such- und Ersetzungsvariablen zu ändern, um dies =in der Zeichenfolge, die ich ersetze, zu kompensieren, aber nichts hat funktioniert:

set search= "OutDir=bin"
set replace= "OutDir=Build"

set search="OutDir=bin"
set replace="OutDir=Build"

set "search=OutDir=bin"
set "replace=OutDir=Build"

"set search=OutDir=bin"
"set replace=OutDir=Build"

Antwort1

Ersetzen des Gleichheitszeichens =in einer Zeichenfolge mit Batch unter Verwendung von PowerShell

Nach dem Testen und der anschließenden Recherche stieß ich aufdiese Antwort auf StackOverflowwas dann auch darauf hinwiesdieser Thread und Beiträge auf DosTipsund =es ist nicht einfach, es durch reines Batch zu ersetzen.

Wenn ich Probleme mit Batch-Scripting habe, bei denen es eine Menge komplexer Batch-Logik braucht oder ich einfach nicht herausfinden kann, wie ich es einfach zum Laufen bekomme, versuche ich normalerweise, einigePower Shellin die Mischung, da esWindowsnativ und kann ohne komplexe Logik viel robuster als Batch sein.

Das folgende Batch-Skript führt im Wesentlichen Folgendes aus:

  • VerwendenInhalte abrufenUndErsetzenfür die zu suchende und zu ersetzende Zeichenfolge
  • Dann wird es verwendenSet-Inhalteum den neu ersetzten String wieder entsprechend in die Datei einzufügen

Skript

@echo off
setlocal enableextensions disabledelayedexpansion

set search=OutDir=bin
set replace=OutDir=Build
set textFile=%DOCUMENT%.txt

:PowerShell
SET PSScript=%temp%\~tmpStrRplc.ps1
ECHO (Get-Content "%~dp0%textFile%").replace("%search%", "%replace%") ^| Set-Content "%~dp0%textFile%">"%PSScript%"

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"
EXIT

Ausgabeergebnis

OutDir=Build

Weitere Ressourcen

Antwort2

Verwenden einer Batchfunktion zum Ersetzen von Zeichenfolgen

Die folgende Funktion kann verwendet werden. Sie benötigt kein GOTO :EOF am Ende, da sie immer von selbst beendet wird.

setlocal enableextensions disabledelayedexpansion

:l_replace
SET "TEMP=x%~1x"
:l_replaceloop
FOR /f "delims=%~2 tokens=1*" %%x IN ("!TEMP!") DO (
IF "%%y"=="" set "TEMP=!TEMP:~1,-1!"&exit/b
set "TEMP=%%x%~3%%y"
)
GOTO :l_replaceloop

Um es zu verwenden, rufen Sie einfach die Funktion auf und fügen Sie dann die drei benötigten Parameter hinzu:

Die zu sendende Variable, die zu suchende Zeichenfolge und die Zeichenfolge, durch die sie ersetzt werden soll.

CALL :l_replace "!VARIABLE!" "=" "#"
SET VARIABLE=!TEMP!

Antwort3

Eine weitere Methode zur Verwendung von Powershell innerhalb von Batches zum Ersetzen von Zeichenfolgen

Ich weiß, dass dies mittlerweile ein alter Beitrag ist, aber ich dachte, ich schlage eine viel einfachere Möglichkeit vor, Zeichenfolgen in Batch-Skripten mithilfe eines Powershell-Befehls zu ersetzen. Es ist gar nicht so schlimm!

setlocal enableextensions disabledelayedexpansion
SET "OLDSTRING=stuff=stuff"

FOR /F "delims=" %%A IN ('powershell -Command "$oldstring ='%OLDSTRING%'; $newstring = $oldstring -replace '=', '#'; $newstring"') DO SET "NEWSTRING=%%A"

ECHO %NEWSTRING%

Das obige Beispiel verwendet eine Variable mit dem aufdringlichen „=“ und ersetzt sie durch eine beliebige andere Zeichenfolge „#“. Um es verständlicher zu machen, habe ich die Variablennamen für Batchvariablen groß und für Powershell-Variablen klein geschrieben.

Damit das Ändern von Zeichenfolgen über eine Textdatei funktioniert, können Sie eine FOR-Schleife in eine andere einbetten

setlocal enableextensions disabledelayedexpansion

FOR /F "delims=" %%B IN ('type textfile.txt') DO (
    FOR /F "delims=" %%A IN ('powershell -Command "$oldstring ='%%B'; $newstring = $oldstring -replace '=', '#'; $newstring"') DO ECHO %%A>>newtextfile.txt

Das obige Verfahren durchläuft die Zeilen in einer Textdatei, ersetzt sie und erstellt eine neue Textdatei mit den vorgenommenen Änderungen. Sie können dann die alte Textdatei löschen und die neue Datei in den Namen der alten Datei umbenennen. Dies ist eine Möglichkeit, es gibt natürlich auch andere.

verwandte Informationen