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

Mat*_*son 3 command-line cmd

这是一个示例:

D:\>set var=123

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

D:\>set var=789 & echo %var%
456
Run Code Online (Sandbox Code Playgroud)

var变量中设置了新值,但echo仍显示旧值。

任何人都知道发生了什么?以及如何获得正确的价值?

MC *_* ND 5

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

在您的情况下,变量中的值在执行时更改,但echo控制台的值是在更改之前确定的。这可以用

set "var=abc"
set "var=123" & set var & echo %var%
Run Code Online (Sandbox Code Playgroud)

set var将向您显示变量中的正确值(在此命令中没有解析器要替换的变量读取操作),但echo会显示旧值(在命令执行之前由解析器替换)。

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

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

set "var=abc"
set "var=123" & echo !var!
Run Code Online (Sandbox Code Playgroud)

但正如所说,这不是通常的情况。您将需要转义百分号以对解析器隐藏变量并强制对该行进行第二次解析器评估。

set "var=abc"
set "var=123" & call echo ^%var^%
Run Code Online (Sandbox Code Playgroud)

或者您可以生成一个cmd启用延迟扩展的单独实例

set "var=abc"
set "var=123" & cmd /v /c"echo !var!"
Run Code Online (Sandbox Code Playgroud)