首页 > 解决方案 > 在批处理数组中使用变量作为索引失败

问题描述

我想迭代一个批处理数组:

SET DEF_APP[0].type=.html
SET DEF_APP[0].name=Firefox
SET DEF_APP[1].type=.htm
SET DEF_APP[1].name=Firefox
SET DEF_APP[2].type=.doc
SET DEF_APP[2].name=LibreOffice
SET DEF_APP[3].type=.docx
SET DEF_APP[3].name=LibreOffice

SET I=0
:APP_LOOP 
IF DEFINED DEF_APP[%I%].type ( 
   ECHO %DEF_APP[%I%].type% %I%
   ECHO %DEF_APP[%I%].name% %I%
   SET /A I=I+1
   GOTO :APP_LOOP 
)
ECHO "Length is" %I%
ECHO %DEF_APP[1].type% %I%
ECHO %DEF_APP[1].name% %I%

PAUSE
EXIT

虽然 %I% 打印为 1,2,3,4 似乎,但 %I% 不能用作数组的索引。打印输出为:

I 0
I 0
I 1
I 1
I 2
I 2
I 3
I 3
"Length is" 4
.htm 4
Firefox 4
Drücken Sie eine beliebige Taste . . .

我想知道,为什么数组的打印输出总是“I”(没有错误或其他东西)?在其他示例中(例如下面示例中的Tutorialspoint)它应该可以工作。他们正在使用“CALL ECHO %%...”

set Arr[0] = 1 
set Arr[1] = 2 
set Arr[2] = 3 
set Arr[3] = 4 
set "x = 0" 
:SymLoop 

if defined Arr[%x%] ( 
   call echo %%Arr[%x%]%% 
   set /a "x+=1"
   GOTO :SymLoop 
)
echo "The length of the array is" %x%

当我打印出来

ECHO %DEF_APP[1].name% %I%

(就像最后两个回声一样),它会打印出正确的值“Firefox 1”。当我打印时

SET I=1
ECHO %DEF_APP[%1%].name% %I%

它打印出“I 1”。是否可以将索引 %I% 过度指定为 char 而不是 int?为什么要打印字母“I”?

标签: arraysbatch-fileindexing

解决方案


了解扩展或失败原因的关键在于三个不同扩展阶段的顺序。

首先发生百分比膨胀。
百分号之间的所有变量都在此处展开​​。它不会猜测变量名。它只需要百分号之间的字符。这些阶段在执行分析之前扩展变量,这对于代码块尤其重要。

然后对于变量(它们也使用百分号)进行扩展。最后一个扩展是延迟扩展(必须启用)

如果该行以 CALL 命令为前缀,则开始第四轮扩展。这是一个百分比扩展。

对于您的阵列问题:

SET I=1
ECHO %DEF_APP[%I%].name% %I%

无法工作,因为百分比扩展试图扩展DEF_APP[并且].name

你可以使用

Echo !DEF_APP[%I%].name! %I%

现在 %I% 扩展,然后是 DEF_APP[1].name


推荐阅读