为什么%变量不起作用!批处理文件中有变量?

时间:2019-04-17 04:30:58

标签: batch-file for-loop

我在for循环中使用数组,并在每个时间循环处理数组值时尝试将值分配给变量。但是当我将值分配给变量时,结果却与预期不符。

这就是我想要做的:

     @echo off
     setlocal enabledelayedexpansion
     SET var[0]=a
     SET var[1]=b
     SET var[2]=c
     SET var[3]=d
     for %%a in (0,1,2,3) do (
     SET name=%var[%%a]%
     ECHO %name%
     )

,但结果显示数组的最后一个值为'd'。我不想使用ECHO !name!。并期望使用%

输出如下
 a
 b
 c
 d

1 个答案:

答案 0 :(得分:1)

通常会显示ECHO is off.,因为之前没有声明过%name%。假设您将null的默认值设置为%name%,那么输出将是null,而不是abcd。这是因为%name%是在循环外部声明的。

这是怎么回事?代码块内的echo %name%将在运行变量之前先获取变量%name%,因此,解析后的代码块内的代码为:

(
  set name=
  rem "%var[%" = "" and "%a]%" also = ""
  echo 
  rem %name% wasn't here, because it's parsed before you run it.
)

!符号是替代变量pre / suffix,仅在您使用时有效

setlocal EnableDelayedExpansion

使用!的变量仅在语句实际运行而不是解析时才被解析:

(
  set name=!var[%%a]!
  echo !name!
)

这一次,代码块将忽略!符号,而只寻找%符号,并且由于for循环,%%a将被数字代替:

(
  set name=!var[0]!
  echo !name!
)
(
  set name=!var[1]!
  echo !name!
)
(
  set name=!var[2]!
  echo !name!
)
(
  set name=!var[3]!
  echo !name!
)

下次,如果要更改变量并使用它,则可能必须使用!而不是%,否则会得到重复的结果。而且,如果您想echo !符号,可以将其转义:

echo escaped "^!" symbol^!