for .... do (
call echo !line:%%foo%%=bar!
)
我在bat文件中使用的代码旨在将变量%foo%
值替换为bar
但它可以将%foo%
视为文字%
符号。与命令echo !line:%%foo%%=bar!
(没有调用)相同的结果。 call
命令不起作用。
我想知道为什么它不能用作call echo %%foo%%
,以便在从bat文件中读取命令行后call echo
将解析%foo%
值。
答案 0 :(得分:1)
由于解析器阶段的顺序,它无法工作。
的示例执行
set foo=xxx
set line=Content xxx # %%foo%% #
第一阶段是百分比扩张阶段
您在括号块中使用它不会改变此行为
所以你得到了
call echo !line:%foo%=bar!
然后开始执行该块,如果该行被执行,则下一个相关阶段是延迟扩展阶段,%foo%
将被替换而不是内容,所以你得到了
call echo Content xxx # bar #
现在,调用以百分比扩展重新启动解析器,但不再有百分比。
我认为foo
的内容可以在FOR-Loop内部发生变化,因此您需要随时扩展它,而不仅仅是在解析块时扩展它。
即使你逃避了感叹号,所以它们在通话后首先被启用,它也无法工作,因为延迟扩展在呼叫执行中不起作用。
但你可以使用它,这可以作为FOR-Variable扩展阶段就在延迟扩展阶段之前。
for ... do (
for /F "delims=" %%F in("!foo!") DO
echo !line:%%F=bar!
)
有关解析器阶段的一些解释是How does the Windows Command Interpreter (CMD.EXE) parse scripts?