arrays - 在批处理数组中使用变量作为索引失败
问题描述
我想迭代一个批处理数组:
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”?
解决方案
了解扩展或失败原因的关键在于三个不同扩展阶段的顺序。
首先发生百分比膨胀。
百分号之间的所有变量都在此处展开。它不会猜测变量名。它只需要百分号之间的字符。这些阶段在执行分析之前扩展变量,这对于代码块尤其重要。
然后对于变量(它们也使用百分号)进行扩展。最后一个扩展是延迟扩展(必须启用)
如果该行以 CALL 命令为前缀,则开始第四轮扩展。这是一个百分比扩展。
对于您的阵列问题:
SET I=1
ECHO %DEF_APP[%I%].name% %I%
无法工作,因为百分比扩展试图扩展DEF_APP[
并且].name
你可以使用
Echo !DEF_APP[%I%].name! %I%
现在 %I% 扩展,然后是 DEF_APP[1].name
推荐阅读
- node.js - 在 node-red 中使用 `functionGlobalContext` 有什么好处?
- c++ - c++中sdt::pair和struct之间的选择
- python - 在数据库中加入具有非常大的持久表的内存数据帧?
- qt - QML SwipeView 同时显示所有项目
- django - 多对多领域的Django外键
- docker - Docker Compose 2 节点 Elasticsearch 集群与 Kibana
- php - 错误 PrestaShop “无法选择任何有效的 SQL 引擎。在文件 classes/db/Db.php 的第 302 行”
- javascript - 如何在 javascript 中扩展具有许多参数的类
- hardware - 构建和开发 Strongbox 的硬件要求是什么?
- c++ - C++ 编写(构建)一个新的二进制文件