このスクリプトでは置換はうまくいきます。動的にしようとしています。
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_replace
og の終了として解釈するため、次のようなことはできませんlineString
。
つまり、2つの選択肢があります。
最も簡単なのは、コマンドを開始する前に、置換する値がわかっている必要があることです。コマンドの前にfor
定義するだけです。パーサーがコマンドに到達すると、変数は正しい値を持ち、適切に展開されます。to_replace
for
for
しかし、何らかの理由でコマンド内で変数の値を定義する必要がある場合は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
置換式で使用される新しい置換可能なパラメータに格納されます。