Command line 具有旧值的Windows批处理回显变量

Command line 具有旧值的Windows批处理回显变量,command-line,cmd,Command Line,Cmd,以下是一个示例: D:\>set var=123 D:\>set var=456 & echo %var% 123 D:\>set var=789 & echo %var% 456 var变量中设置了一个新值,但echo仍显示一个旧值 有人知道发生了什么事吗?如何得到正确的值 当请求执行串接或括在括号中的命令或命令块时,解析器在开始执行命令/命令块之前,用变量中的内容替换变量上的所有读取操作 在您的情况下,变量中的值在执行时更改,但要回显到控制台的值是在进

以下是一个示例:

D:\>set var=123

D:\>set var=456 & echo %var%
123

D:\>set var=789 & echo %var%
456
var变量中设置了一个新值,但echo仍显示一个旧值


有人知道发生了什么事吗?如何得到正确的值

当请求执行串接或括在括号中的命令或命令块时,解析器在开始执行命令/命令块之前,用变量中的内容替换变量上的所有读取操作

在您的情况下,变量中的值在执行时更改,但要回显到控制台的值是在进行更改之前确定的。这可以通过以下方法进行测试:

设置var=abc 设置变量=123&设置变量&回显%var% set var将在此命令中显示变量中的正确值解析器没有要替换的变量读取操作,但echo将在命令执行之前显示由解析器替换的旧值

在批处理文件中,通常的处理方法是使用延迟扩展setlocal enabledelayedexpansion命令,这将允许您在需要时更改从%var%访问变量的语法!变量!,向解析器指示读取操作必须延迟到命令执行为止

但不能从命令行启用延迟扩展。也许它是启用的,而不是默认状态,您将能够使用它

设置var=abc 设置var=123&echo!瓦尔! 但正如所说,这不是通常的情况。您将需要转义百分号以从解析器中隐藏变量,并强制解析器对该行进行第二次求值

设置var=abc 设置var=123&调用echo^%var^% 或者,您可以在启用延迟扩展的情况下生成单独的cmd实例

设置var=abc 设置var=123&cmd/v/cecho!瓦尔! 这与延迟扩张有关

将解析整个命令,并将任何%var%替换为其当前值

然后执行命令。值是可变的,但echo命令已将变量替换为解析时的值

您可以尝试设置var以显示当前值,或者在“设置var 2^>nul”do echo%%b中为/f令牌=1*delims==%%a,或者在“设置var 2^>nul”do if/i%%a==var echo%%b中为/f令牌=1*delims==%%a,甚至更为健壮

如果2^>nul抑制错误消息,则不应定义var。需要插入符号^来告诉cmd重定向程序是for应该执行的命令的一部分


由于set var将列出startvar中的所有变量,因此最后一种方法比前一种方法更可靠。

也许您假设命令解释器从左到右工作?if从右到左工作如何?&语法:command1和command2:用于在一个命令行上分隔多个命令。Cmd.exe运行第一个命令,然后运行第二个命令。