为什么echo使用与set不同的loop-variable值?

时间:2016-02-11 07:55:52

标签: batch-file cmd

我试图使用一个简单的for循环来创建一系列字符串后跟一个数字。但是,当我尝试将iterator-variable添加到字符串的末尾时,添加的值将是循环的端点。

该脚本的简化版本是:

@echo off

set STARTSTRING="Test-

for /l %%x in (1, 1, 26) do (
    echo %%x
    set CONCATENATED_STRING=%STARTSTRING%%%x"
    echo %CONCATENATED_STRING%
)
pause

给出了输出:

enter image description here

有人可以向我解释我哪里出错了吗?

1 个答案:

答案 0 :(得分:2)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此,FOR ... DO (block)将在遇到IF (something) else (somethingelse)时使用%variables%的值执行。

解决此问题的两种常见方法是1)使用IF并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var%或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

所以 -

var

注意引号的位置(以便行末端的杂散空格不会分配给变量。)

@echo off setlocal enabledelayedexpansion set "STARTSTRING=Test-" for /l %%x in (1, 1, 26) do ( echo %%x set "CONCATENATED_STRING=!STARTSTRING!%%x" echo !CONCATENATED_STRING! ) pause !var!模式访问变量的运行时值 - delayedexpansion分析时间值

%var%还确保批处理结束时,对环境变量所做的任何更改都将被丢弃。正如您所看到的,该变量保留了其在上一批次运行中设置的值。