您遇到了 cmd 的静态变量扩展问题。MODE 变量只计算一次。如果您省略 @echo 离线,您可以看到这一点。
从集/?文档:
最后,添加了对延迟环境变量扩展的支持。默认情况下始终禁用此支持,但可以通过 /V 命令行开关到 CMD.EXE 启用/禁用。见 CMD /?
延迟的环境变量扩展对于绕过当前扩展的限制很有用,这种限制发生在读取一行文本时,而不是在执行时。以下示例演示了立即变量扩展的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
永远不会显示该消息,因为 BOTH IF 语句中的 %VAR% 在读取第一个 IF 语句时被替换,因为它在逻辑上包括 IF 的主体,这是一个复合语句。因此,复合语句中的 IF 实际上是将“之前”与“之后”进行比较,这永远不会相等。同样,以下示例将无法按预期工作:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
因为它不会在当前目录中建立文件列表,而是将 LIST 变量设置为找到的最后一个文件。同样,这是因为在读取 FOR 语句时 %LIST% 只扩展了一次,而此时 LIST 变量为空。所以我们正在执行的实际 FOR 循环是:
for %i in (*) do set LIST= %i
它只是将 LIST 设置为找到的最后一个文件。
延迟环境变量扩展允许您在执行时使用不同的字符(感叹号)来扩展环境变量。如果启用了延迟变量扩展,则上述示例可以编写如下以按预期工作:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%