Das Problem ist das Pipe-Zeichen |
, das aufgrund der sofortigen Erweiterung der Variablen %search%
ausgeführt werden soll.
Eine mögliche Behelfslösung ist eine Zwischen variable Zuordnung zu verwenden (set "line=..."
), die Anführungszeichen erlaubt, so dass das Rohr nicht mehr erkannt wird, und dann in Ihrem echo
Kommandozeile nur verzögert Expansion zu verwenden - wie folgt aus:
setlocal EnableExtensions DisableDelayedExpansion
set /P txtfile="Text File Name: "
echo/
set /P search="Search for: "
echo/
set /P replace="Replace to: "
for /F "delims=" %%i in ('type "%txtfile%.txt" ^& break ^> "%txtfile%.txt"') do (
set "line=%%i"
setlocal EnableDelayedExpansion
set "line=!line:%search%=%replace%!"
>>"%txtfile%.txt" echo(!line!
endlocal
)
pause
endlocal
Eine andere Lösung verzögerte Expansion ist auch für !search!
und !replace!
zu verwenden; Damit dies funktioniert, können Sie nicht direkt Nest Erweiterung verzögert, so benötigen Sie eine for /F
Schleife zu verwenden, die Verschachtelung zu tun - wie folgt aus: Linie
setlocal EnableExtensions DisableDelayedExpansion
set /P txtfile="Text File Name: "
echo/
set /P search="Search for: "
echo/
set /P replace="Replace to: "
for /F "delims=" %%i in ('type "%txtfile%.txt" ^& break ^> "%txtfile%.txt"') do (
set "line=%%i"
setlocal EnableDelayedExpansion
for /F "delims=" %%j in ("!search!=!replace!") do (
>>"%txtfile%.txt" echo(!line:%%j!
)
endlocal
)
pause
endlocal
Statt Umleitung (>>
) jede einzelne Ausgabe einzeln Sie könnte auch die ganze for /F
Schleife durch >
, leiten aber dann müssen Sie eine andere Datei als die, die Sie lesen verwenden - siehe diese (zeigt nur die erste Variante von oben):
setlocal EnableExtensions DisableDelayedExpansion
set /P txtfile="Text File Name: "
echo/
set /P search="Search for: "
echo/
set /P replace="Replace to: "
> "%txtfile%.tmp" (
for /F "usebackq delims=" %%i in ("%txtfile%.txt") do (
set "line=%%i"
setlocal EnableDelayedExpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
)
)
move /Y "%txtfile%.tmp" "%txtfile%.txt" > nul
pause
endlocal
Dies ist ein pproach ist im Hinblick auf die Leistung viel besser, insbesondere bei großen Eingabedateien.
Bitte geben Sie die Beispieldaten als Text und nicht als Bild, so Beantworter sie einfach ihren Code zum Testen kopieren .. – aschipfl