変数%search%
の即時拡張のために実行しようとしているパイプ文字|
が問題です。
可能仕事の前後に引用符を可能に暫定変数の代入(set "line=..."
)を使用することではありませんので、パイプはもはや認識され、その後、あなたのecho
コマンドラインでのみ遅れ拡張を使用する - このように:
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
もう1つの解決策は、!search!
と!replace!
でも遅延拡張を使用することです。これが機能するためには、直接巣の拡大を遅らせることはできませんので、あなたは、入れ子に行うためにfor /F
ループを使用する必要がある - このような:個別にリダイレクトする代わりに
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
(>>
)ごとに単一の出力ラインを、あなたも>
によって全体for /F
ループをリダイレクトすることもできますが、あなたはあなたが読んものとは別のファイルを使用する必要があります - この(上からのみ第一の変形例を示す)を参照してください:
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
このAをpproachは、特に巨大な入力ファイルの場合は、パフォーマンスの点ではるかに優れています。
を回答者が自分のコードをテストするためにそれらを単にコピーすることができますので、テキストとしてではなく、画像としてのサンプルデータを挿入してください。.. – aschipfl