关于“call echo!line:%% foo %% = bar!”

时间:2011-07-28 10:53:58

标签: batch-file

for .... do (
    call echo !line:%%foo%%=bar!
)

我在bat文件中使用的代码旨在将变量%foo%值替换为bar 但它可以将%foo%视为文字%符号。与命令echo !line:%%foo%%=bar!(没有调用)相同的结果。 call命令不起作用。 我想知道为什么它不能用作call echo %%foo%%,以便在从bat文件中读取命令行后call echo将解析%foo%值。

1 个答案:

答案 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?