为什么 for 循环中的单个 % 在命令行中没有解释为环境变量,而是在批处理文件中?



关于这个问题,这个问题仍然没有答案:

有没有解释为什么我可以在 FOR 循环中仅使用 1% 的登录,当直接从命令提示符而不是从批处理文件执行时?我知道 DOS 遗产,但我们现在可以从命令行使用变量。

您可以在命令行上使用环境变量,那么为什么FOR /L %A in (1,1,5) Do Echo %A之类的东西在命令行上也没有解释为%A in (1,1,5) Do Echo %环境变量呢?

我不知道命令行解析与批处理模式解析如此不同的原因。可能与旧DOS行为的向后兼容性有关。

但是命令行确实尝试将%A in (1,1,5) Do Echo %视为变量!

D:test>FOR /L %A in (1,1,5) Do Echo %A
D:test>Echo 1
1
D:test>Echo 2
2
D:test>Echo 3
3
D:test>Echo 4
4
D:test>Echo 5
5
D:test>set "A in (1,1,5) Do Echo =XXXX"
D:test>FOR /L %A in (1,1,5) Do Echo %A
XXXXA was unexpected at this time.

在第一个实例中,未定义奇数变量,因此 FOR 命令成功。第二次定义奇数变量时,展开会导致命令无效。

命令行模式不会将未定义的变量扩展为空,而是保留初始%,然后查找其他变量进行扩展。

例如,如果未定义 X,并且 Y=1,则%X%Y%将在命令行上展开为%X1。但是在批处理文件中,它将扩展到Y.

结果完全可以通过 https://stackoverflow.com/a/7970912/1012053 发布的规则来预测,但可能很难遵循。