具有旧值的Windows Batch echo变量

时间:2015-04-23 05:13:02

标签: command-line cmd

以下是一个示例:

 someActivity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
       //Your code to run in GUI thread here
    }//public void run() {
 });

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

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

2 个答案:

答案 0 :(得分:2)

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

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

进行测试
set "var=abc"
set "var=123" & set var & echo %var%

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

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

但是您无法从命令行启用延迟扩展。也许它已启用(不是默认状态),您可以使用它

!var!

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

set "var=abc"
set "var=123" & echo !var!

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

cmd

答案 1 :(得分:0)

这与delayedexpansion

有关

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

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

您可以尝试set var显示当前值,或for /f "tokens=1*delims==" %%a in ('set var 2^>nul') do echo %%b或更强大,for /f "tokens=1*delims==" %%a in ('set var 2^>nul') do if /i "%%a"=="var" echo %%b

2^>nul抑制错误消息的位置{@ 1}}不应定义。插入符号var)需要告诉^重定向器是cmd应该执行的命令的一部分。

由于for将列出所有以set var开头的变量,因此最后一种方法比前者更强大。