在 DOS/Windows 批处理文件中,如何设置/使用数组和循环索引中的变量,以便可以生成如下所示的输出?
SETLOCAL ENABLEDELAYEDEXPANSION
set x[0]=one
set x[1]=two
set x[2]=three
for %%i in (0,1,3) do (
call set y=%x[%%i]%
echo y=%y%
)
DESIRED OUTPUT:
y=one
y=two
y=three
我真正想做的是反复调用一个程序并传递一堆参数,其中一个参数是数组变量。如果我将 call set 行中的 [%%i] 替换为 [0],则执行该行时的输出将如预期的那样为“call set y=one”。但如果我使用 [%%i] 访问数组元素,输出将更改为“call set y=”。我尝试了很多种方法组合来做到这一点,但没有一种能产生所需的结果 :(
答案1
如何设置/使用数组和循环索引中的变量?
您对代码的想法是正确的,但是您缺少了使其正常工作所需的一些细节。
下面将执行您想要的操作(test.cmd)
@echo off
setlocal enabledelayedexpansion
set x[0]=one
set x[1]=two
set x[2]=three
for %%i in (0,1,2) do (
set y=!x[%%i]!
echo y=!y!
)
endlocal
示例输出:
F:\test>test
y=one
y=two
y=three
F:\test>
笔记:
for
应该是for /l
,但它似乎/l
是可选的,因为没有它也可以工作。- 您的
for
循环结束值应该2
不是3
。 - 您声明
setlocal enabledelayedexpansion
正确,但没有%
在!
适当的地方替换。 call
之前你不需要set
。- 您没有结束脚本,
endlocal
因此您的变量将“泄漏”到父 cmd shell 中。