Batch file 关于「;呼叫回声!行:%%foo%%=bar&引用;

Batch file 关于「;呼叫回声!行:%%foo%%=bar&引用;,batch-file,Batch File,我在bat文件中使用的代码旨在将变量%foo%值替换为bar。 但它可以将%foo%视为文字%符号。结果与命令echo相同!行:%%foo%%=bar(withtout调用)没有。调用命令不起作用。 我想知道为什么它不能像callecho%%foo%%那样工作,以便callecho在从bat文件读取命令行后解析%foo%%值。由于解析器阶段的顺序,它不能工作 执行示例 for .... do ( call echo !line:%%foo%%=bar! ) 第一阶段是百分比扩展阶段。

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

由于解析器阶段的顺序,它不能工作

执行示例

for .... do (
    call echo !line:%%foo%%=bar!
)
第一阶段是百分比扩展阶段。
在括号块中使用它不会改变这种行为。
所以你得到了
呼叫回声!行:%foo%=bar

然后开始执行块,如果行被执行,则下一个相关阶段是延迟扩展阶段,
%foo%
将被替换,而不是内容,因此您得到
呼叫回声内容xxx#条#

现在,调用使用扩展百分比重新启动解析器,但不再有扩展百分比

我假设
foo
的内容可以在FOR循环中更改,因此您需要随时扩展它,而不是在解析块时仅扩展一次

即使您避开感叹号,以便在调用后首先启用它们,它也无法工作,因为延迟扩展在调用执行内部不起作用

但是您可以使用它,因为FOR变量展开阶段正好在延迟展开阶段之前

set foo=xxx
set line=Content xxx # %%foo%% #

关于解析器阶段的一些解释位于

由于解析器阶段的顺序,它无法工作

执行示例

for .... do (
    call echo !line:%%foo%%=bar!
)
第一阶段是百分比扩展阶段。
在括号块中使用它不会改变这种行为。
所以你得到了
呼叫回声!行:%foo%=bar

然后开始执行块,如果行被执行,则下一个相关阶段是延迟扩展阶段,
%foo%
将被替换,而不是内容,因此您得到
呼叫回声内容xxx#条#

现在,调用使用扩展百分比重新启动解析器,但不再有扩展百分比

我假设
foo
的内容可以在FOR循环中更改,因此您需要随时扩展它,而不是在解析块时仅扩展一次

即使您避开感叹号,以便在调用后首先启用它们,它也无法工作,因为延迟扩展在调用执行内部不起作用

但是您可以使用它,因为FOR变量展开阶段正好在延迟展开阶段之前

set foo=xxx
set line=Content xxx # %%foo%% #

关于解析器阶段的一些解释见

谢谢@jeb,我现在知道了。因为我省略了“!”感叹号解析的运行优先级。我通过电话找到了解决办法:标签!福!,在发布此问题之前使用%1参数引用。:)谢谢@jeb,我现在拿到了。因为我省略了“!”感叹号解析的运行优先级。我通过电话找到了解决办法:标签!福!,在发布此问题之前使用%1参数引用。:)