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!=!그러나 파서가 시작을 종료 og로 해석하는 것과 !같은 to_replace작업 을 수행할 수는 없습니다 lineString.

따라서 두 가지 옵션이 있습니다.

가장 쉬운 방법은 명령이 시작되기 전에 해당 값을 바꿔야 한다는 것입니다 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교체 표현식에 사용되는 교체 가능한 새 매개변수 에 저장합니다.

관련 정보