Cmd 或 Batch - 设置变量然后回显失败

Cmd or Batch - Setting Variable then echoing fails

我在 Github 上找到了一个 GUI 应用程序,我用它来将命令行存储到 运行。作者使用以下语法获取我输入的内容并在 cmd window -

中使用它

我进入他的表格-

set "test=four"

echo %test%

pause

他转成这个,显示变量内容失败-

"C:\Windows\System32\cmd.exe" /Kset "test=four"&&echo %test%&&pause

结果是%test%,不是test变量的内容,是四。

如果我 运行 他自己在 cmd window 中的命令行,它也无法获取 var 内容并显示 %test%.

那么为什么这不起作用,我建议他只复制我在他的表格中输入的内容并粘贴到他生成的 cmd window 中并 运行 它。可以轻松编码吗?这是最简单的解决方法吗?

TL;DR:使用 cmd /v:on /k (set "test=four" ^& echo !test! ^& pause)
阅读 How does the Windows Command Interpreter (CMD.EXE) parse scripts? 以获取有关正在发生的事情的更多信息。


首先我想说将命令链接到同一行总是一个坏主意。出于某种原因,您被允许在多行上执行 运行 命令,您应该利用这一点;它使事情更容易阅读,并使脚本表现得更好。

就是说, 有一种方法可以做到这一点,但您的代码有多种因素使其无法正常工作。

首先,&& 仅用于在第一个命令成功时 运行 执行第二个命令。 cmdecho 都不会失败,所以你在这里只需要 &echo %test% 与代码的其余部分 运行 分开,因为解释器读取代码的方式认为您只想 运行 "C:\Windows\System32\cmd.exe" /Kset "test=four" 然后 运行 echo %test% 一次成功返回。为了 运行 同一 cmd 实例中的所有三个命令,您需要使用括号,以便所有内容都被视为单个命令。

此外,为了告诉解释器在新的 cmd 实例 运行ning 之前,& 不打算用于链接命令,您需要转义他们 ^.

最后,因为您试图在同一行设置和使用一个变量,所以解释器会尝试在 %test% 首次读入时用它的值替换它的值,然后该值才有机会获得放。要解决此问题,您需要使用 /V:on 标志启用延迟扩展,然后使用 !test! 以便变量在执行时不会扩展。