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? 以获取有关正在发生的事情的更多信息。
首先我想说将命令链接到同一行总是一个坏主意。出于某种原因,您被允许在多行上执行 运行 命令,您应该利用这一点;它使事情更容易阅读,并使脚本表现得更好。
就是说, 有一种方法可以做到这一点,但您的代码有多种因素使其无法正常工作。
首先,&&
仅用于在第一个命令成功时 运行 执行第二个命令。 cmd
和 echo
都不会失败,所以你在这里只需要 &
。 echo %test%
与代码的其余部分 运行 分开,因为解释器读取代码的方式认为您只想 运行 "C:\Windows\System32\cmd.exe" /Kset "test=four"
然后 运行 echo %test%
一次成功返回。为了 运行 同一 cmd 实例中的所有三个命令,您需要使用括号,以便所有内容都被视为单个命令。
此外,为了告诉解释器在新的 cmd
实例 运行ning 之前,&
不打算用于链接命令,您需要转义他们 ^
.
最后,因为您试图在同一行设置和使用一个变量,所以解释器会尝试在 %test%
首次读入时用它的值替换它的值,然后该值才有机会获得放。要解决此问题,您需要使用 /V:on
标志启用延迟扩展,然后使用 !test!
以便变量在执行时不会扩展。
我在 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? 以获取有关正在发生的事情的更多信息。
首先我想说将命令链接到同一行总是一个坏主意。出于某种原因,您被允许在多行上执行 运行 命令,您应该利用这一点;它使事情更容易阅读,并使脚本表现得更好。
就是说, 有一种方法可以做到这一点,但您的代码有多种因素使其无法正常工作。
首先,&&
仅用于在第一个命令成功时 运行 执行第二个命令。 cmd
和 echo
都不会失败,所以你在这里只需要 &
。 echo %test%
与代码的其余部分 运行 分开,因为解释器读取代码的方式认为您只想 运行 "C:\Windows\System32\cmd.exe" /Kset "test=four"
然后 运行 echo %test%
一次成功返回。为了 运行 同一 cmd 实例中的所有三个命令,您需要使用括号,以便所有内容都被视为单个命令。
此外,为了告诉解释器在新的 cmd
实例 运行ning 之前,&
不打算用于链接命令,您需要转义他们 ^
.
最后,因为您试图在同一行设置和使用一个变量,所以解释器会尝试在 %test%
首次读入时用它的值替换它的值,然后该值才有机会获得放。要解决此问题,您需要使用 /V:on
标志启用延迟扩展,然后使用 !test!
以便变量在执行时不会扩展。