【问题标题】:can't access array index in batch file无法访问批处理文件中的数组索引
【发布时间】:2016-06-23 12:10:44
【问题描述】:

我想拥有:

a=id
b=name
c=age

这是我写的批处理窗口文件:

setlocal enabledelayedexpansion
set MY_LIST[0]=id
set MY_LIST[1]=name
set MY_LIST[2]=age
set /A COUNTER=0
FOR %%A IN (A B C) DO (

  ECHO %%A=%MY_LIST[!COUNTER!]%
  set /A COUNTER+=1
)
endlocal

为什么这不起作用?

【问题讨论】:

  • 是什么让你认为批处理文件数组索引? (提示:他们没有!)你可以得到类似你正在尝试的东西:删除所有提及COUNTER,使用for %%a in (0 1 2)(或for /l 构造)然后echo %%a=!MY_LIST[%%a]!。您需要 ! 来访问(三个不同的)MY_LIST 变量,因为您每次都在循环构建名称。
  • @TripeHound "如果初学者会问:“如何用 C 语言编写消息?”,你认为正确的答案应该是:'你不能。C 语言可以不正式支持任何 I/O 语句,但是您可以通过库函数模拟此类操作'?当然不是!...好吧,在我看来,对于 Batch 中的数组,应该使用相同的方法。" -- Antonio Acini;除非限制直接相关(即尝试调用数组的 .length 方法),否则声称 Batch 语言不支持数组是没有效率的。
  • 我试图指出——可能比我应该更半开玩笑/讽刺地指出(如果有任何冒犯,请向 OP 道歉)——这些不是 数组——它们只是多个环境变量,它们的名称恰好有方括号。我没有看到你引用的 Q/A(也没有意识到人们非正式地想到了“批处理文件中的数组”)……读过之后,我个人倾向于支持@987654322 @ 因为使用类似数组的名称会带来太多的包袱/期望。
  • @TripeHound 它还提高了可读性,清楚地传达了作者对变量集合的预期用途。变量显然是相关值的列表,单个列表对象的分配属性(从功能上讲)。 OP 很清楚,他不能调用此列表中其他语言中常见的方法。他显然没有问为什么不能MY_LIST.push("new value")。他的代码组织良好,不值得批评“这些不是数组”如何解决他的问题。

标签: batch-file


【解决方案1】:

您的延迟扩展顺序颠倒了。在您拥有%MY_LIST[!COUNTER!]% 的地方,解释器在尝试扩展外部时尚未扩展内部。在将!COUNTER! 用作数组索引之前,您需要找到另一种方法来扩展!MY_LIST[n]!,并将!MY_LIST[n]! 的扩展延迟甚至比!COUNTER! 的扩展时间更长。这是一种方法:

for %%A in (A B C) do (

    for %%I in ("!COUNTER!") do ECHO %%A=!MY_LIST[%%~I]!
    set /A COUNTER += 1
)

【讨论】:

  • 谢谢.. 它有效。一个问题 - 为什么会这样?为什么在我的代码中“解释器在尝试扩展外部时没有扩展内部”?
  • @Matoy 因为百分比变量在循环运行之前展开。在这个百分比变量展开时,!COUNTER!还没有价值。 %COUNTER% 可以,但是 !COUNTER!还没有扩大。它基本上是一个字符串文字“COUNTER”,此时被感叹号包围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 2017-09-15
  • 2021-03-29
  • 1970-01-01
相关资源
最近更新 更多