bat スクリプトの for ループ内での文字列の置換

bat スクリプトの for ループ内での文字列の置換

このスクリプトでは置換はうまくいきます。動的にしようとしています。

SETLOCAL enabledelayedexpansion
for /f "tokens=* delims= " %%a in (C:\workspace\iwms_kw_patch_script\BuildPatchScript\140903111828_batch_file.txt) do (
    set lineString=%%a

    set str2=!lineString:C:\iwms_builder_working_directory\tmp\IWMS_KW_01_CBI_2014-003\=!
    echo !str2!

    echo IF NOT %ERRORLEVEL%==0 GOTO ERROR_HANDLER2 >> %output_file%
)
endlocal

そして、これは機能していません。

SETLOCAL enabledelayedexpansion
for /f "tokens=* delims= " %%a in (C:\workspace\iwms_kw_patch_script\BuildPatchScript\140903111828_batch_file.txt) do (
    set to_replace=C:\iwms_builder_working_directory\tmp\IWMS_KW_01_CBI_2014-003\
    set lineString=%%a
    set str2=!lineString:%to_replace%=!
    echo !str2!

    echo IF NOT %ERRORLEVEL%==0 GOTO ERROR_HANDLER2 >> %output_file%
)
endlocal

for ループ内で文字列を変数に置き換えることはできますか? ありがとうございます :D

答え1

問題は変数の展開です。変数がforコード ブロック内で変更された場合、同じブロック内でその値にアクセスするには遅延展開が必要です。

!lineString:!to_replace!=!しかし、パーサーは!in の開始をto_replaceog の終了として解釈するため、次のようなことはできませんlineString

つまり、2つの選択肢があります。

最も簡単なのは、コマンドを開始する前に、置換する値がわかっている必要があることです。コマンドの前にfor定義するだけです。パーサーがコマンドに到達すると、変数は正しい値を持ち、適切に展開されます。to_replaceforfor

しかし、何らかの理由でコマンド内で変数の値を定義する必要がある場合はfor、コードを次のように変更する必要があります。

for /f "tokens=* delims= " %%a in ( .... ) do (
    set "lineString=%%a"

    set "to_replace= .... "
    for %%b in ("!to_replace!") do set "str2=!lineString:%%~b=!"

    echo !str2!
)

これにより、変数の値が、for置換式で使用される新しい置換可能なパラメータに格納されます。

関連情報