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!=!,因为解析器会将 的开头解释!to_replaceog 的终止lineString

因此,您有两个选择。

最简单的方法是在命令开始前知道要替换的值。只需在命令前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替换表达式中使用的新的可替换参数中

相关内容