这是一个示例:
D:\>set var=123
D:\>set var=456 & echo %var%
123
D:\>set var=789 & echo %var%
456
在 var 变量中设置了新值,但 echo 仍显示旧值。
任何人都知道发生了什么?以及如何获得正确的值(value)?
最佳答案
当请求执行命令或命令块(连接或括在括号中的命令)时,解析器将所有对变量的读取操作替换为变量 中的内容。之前 开始执行命令/块
在您的情况下,变量中的值在执行时更改,但值为 echo
控制台是在更改之前确定的。这可以用
set "var=abc"
set "var=123" & set var & echo %var%
set var
将向您显示变量中的正确值(在此命令中,解析器没有要替换的变量读取操作)但是 echo
将显示旧值(在命令执行前由解析器替换)。在批处理文件中,处理它的常用方法是使用延迟扩展(
setlocal enabledelayedexpansion
命令),这将允许您在需要时更改语法以访问来自 %var%
的变量。进入 !var!
,向解析器指示必须延迟读取操作,直到执行命令。但是您不能从命令行启用延迟扩展。也许它已启用(不是默认状态),您将能够使用它
set "var=abc"
set "var=123" & echo !var!
但正如所说,这不是通常的情况。您将需要转义百分号以对解析器隐藏变量并强制对该行进行第二次解析器评估。
set "var=abc"
set "var=123" & call echo ^%var^%
或者您可以生成一个单独的
cmd
启用延迟扩展的实例set "var=abc"
set "var=123" & cmd /v /c"echo !var!"
关于command-line - 具有旧值的 Windows 批处理回显变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29814241/