Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 为什么%变量不能正常工作!我的批处理文件中的变量?_Batch File_For Loop - Fatal编程技术网

Batch file 为什么%变量不能正常工作!我的批处理文件中的变量?

Batch file 为什么%变量不能正常工作!我的批处理文件中的变量?,batch-file,for-loop,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]%

我在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!名字。并期望输出如下所示,带有
%

 a
 b
 c
 d

通常情况下,它会显示“ECHO已关闭”。
因为以前未声明
%name%
。假设您将
%name%
的默认值设置为
null
,那么输出将是
null
,而不是
a
b
c
d
。这是因为
%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/后缀,仅在使用

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 escaped "^!" symbol^!

不确定您不想使用
delayedexpansion
的原因,但如果您真的拒绝使用它,请禁用delayedexpansion,然后使用
call echo%%name%%
,这很难看,也有它自己的缺点。很好的解释,但最后一行
echo-escaped“^!”符号中有一个小缺陷,它只显示第一个感叹号,您需要使用双插入符号
回显转义“^!”符号^