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

标签 command-line cmd

这是一个示例:

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/

相关文章:

azure - 如何作为 Azure 数据工厂的一部分解压缩并执行批处理服务作业

java - 通过在java中模拟命令shell如何执行一个文件?

windows - HTML 输入类型 ="password"的 Windows 批处理等效项是什么?

windows - 使用 Windows 批处理脚本在 FOR 循环中计数

python - 如何使用 Python 将输入发送到 bc 并从 bc 获取输出?

command-line - 使用 Vagrant 的命令行为 CentOS 7 配置 Gnome 桌面

windows - 如何在Windows中为远程git存储库提取最新的提交哈希?

Linux:如何设置进程的时区?

android - Android 上的 FFmpeg 命令行

windows - 学习控制台命令的重要性