问题
一般的batch字符串替换:
rem 将string内的aaa替换为bbb
set string=%string:aaa=bbb%
rem 定义变量var1为aaa,定义变量var2为bbb,此时需要延迟处理
setlocal EnableDelayedExpansion
set var1=aaa
set var2=bbb
set string=!string:%var1%=%var2%!
代码运行中,var1和var2的值可能会变,此时无法直接将%改为!
rem 不合法的
set string=!string:!var1!=!var2!!
方法
使用for循环,保证使用更新后的var1和var2
setlocal EnableDelayedExpansion
set var1=aaa
set var2=bbb
rem /f:从"!var1! !var2!"这个字符串中读取
rem tokens:取前两个token,在这个例子中就是var1,var2的值
rem delims缺省:表示默认用空格作为分隔符
rem %%b:默认是当前token的下一个token
for /f "tokens=1,2" %%a in ("!var1! !var2!") do set string=!string:%%a=%%b!
如果var1和var2可能包含空格,需要指定分隔符为某个不可能出现的字符,下例使用分号;
rem /f:从"!var1!;!var2!"这个字符串中读取
rem tokens:取前两个token,在这个例子中就是var1,var2的值
rem delims:用分号作为分隔符
for /f "tokens=1,2 delims=;" %%a in ("!var1!;!var2!") do set string=!string:%%a=%%b!
参考:
https://stackoverflow.com/questions/41518199/batch-replace-a-delay-expansion-string-with-delay-expansion-parameters