我创建了这样一个数组:
set sources[0]="\\sources\folder1\"
set sources[1]="\\sources\folder2\"
set sources[2]="\\sources\folder3\"
set sources[3]="\\sources\folder4\"
现在我想要遍历这个数组:for %%s in (%sources%) do echo %%s
它不起作用!似乎脚本没有进入循环。为什么?我该如何迭代?
我创建了这样一个数组:
set sources[0]="\\sources\folder1\"
set sources[1]="\\sources\folder2\"
set sources[2]="\\sources\folder3\"
set sources[3]="\\sources\folder4\"
现在我想要遍历这个数组:for %%s in (%sources%) do echo %%s
它不起作用!似乎脚本没有进入循环。为什么?我该如何迭代?
另一个替代方案是使用“defined”和循环,不需要延迟扩展:
set Arr[0]=apple
set Arr[1]=banana
set Arr[2]=cherry
set Arr[3]=donut
set "x=0"
:SymLoop
if defined Arr[%x%] (
call echo %%Arr[%x%]%%
set /a "x+=1"
GOTO :SymLoop
)
请确保使用"call echo",因为如果您没有使用延迟扩展并且使用%%而非!,echo将无法正常工作。
如果你不知道数组有多少元素(似乎是这种情况),你可以使用以下方法:
for /F "tokens=2 delims==" %%s in ('set sources[') do echo %%s
请注意,元素将按字母顺序进行处理,也就是说,如果您有超过9(或99等)个元素,则索引必须在1..9(或1..99等)的元素中留下零。
for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s
in
和 (
之间的空格很重要。这样是不行的:in("\\sources...)
,但如果你加上空格写成 in ("\\sources...)
就可以正常运行了。 - Dimitry K这是一种方法:
@echo off
set sources[0]="\\sources\folder1\"
set sources[1]="\\sources\folder2\"
set sources[2]="\\sources\folder3\"
set sources[3]="\\sources\folder4\"
for /L %%a in (0,1,3) do call echo %%sources[%%a]%%
for /L
循环需要 (0,1,<last_element_id>) 的参数,本例中的 last_element_id 为 3。 - Zac为了后人留存: 我只想在@dss的优秀答案上提出轻微修改建议。
当前结构下,在循环内将Arr的值分配给临时变量时,DEFINED检查的方式会导致意外输出:
例如:
@echo off
set Arr[0]=apple
set Arr[1]=banana
set Arr[2]=cherry
set Arr[3]=donut
set "x=0"
:SymLoop
if defined Arr[%x%] (
call set VAL=%%Arr[%x%]%%
echo %VAL%
REM do stuff with VAL
set /a "x+=1"
GOTO :SymLoop
)
donut
apple
banana
cherry
@echo off
set Arr[0]=apple
set Arr[1]=banana
set Arr[2]=cherry
set Arr[3]=donut
set "x=0"
:SymLoop
if not defined Arr[%x%] goto :endLoop
call set VAL=echo %%Arr[%x%]%%
echo %VAL%
REM do your stuff VAL
SET /a "x+=1"
GOTO :SymLoop
:endLoop
echo "Done"
apple
banana
cherry
donut
"Done"
echo %var%
改为 call echo %%var%%
即可按预期工作。或者更好的方法是使用延迟扩展。 - jebfor %%r in ("https://github.com/patrikx3/gitlist" "https://github.com/patrikx3/gitter" "https://github.com/patrikx3/corifeus" "https://github.com/patrikx3/corifeus-builder" "https://github.com/patrikx3/gitlist-workspace" "https://github.com/patrikx3/onenote" "https://github.com/patrikx3/resume-web") do (
echo %%r
git clone --bare %%r
)