47

我创建了一个这样的数组:

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

它不起作用!似乎脚本没有进入循环。这是为什么?那我该如何迭代呢?

4

6 回答 6

50

另一种使用已定义和不需要延迟扩展的循环的替代方案:

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
)

确保您使用“呼叫回声”,因为除非您延迟扩展并使用,否则回声将不起作用!代替 %%

于 2014-09-11T15:48:13.233 回答
41

If you don't know how many elements the array have (that seems is the case), you may use this method:

for /F "tokens=2 delims==" %%s in ('set sources[') do echo %%s

Note that the elements will be processed in alphabetical order, that is, if you have more than 9 (or 99, etc) elements, the index must have left zero(s) in elements 1..9 (or 1..99, etc.)

于 2013-08-28T06:38:34.780 回答
31

如果您不需要环境变量,请执行以下操作:

for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s
于 2013-08-27T13:02:32.030 回答
15

这是一种方式:

@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]%%
于 2013-08-27T09:58:30.107 回答
5

对于后代:我只是想对@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

最后一个元素首先打印。为了解决这个问题,当我们完成数组而不是执行它时,反转 DEFINED 检查让它跳过循环更简单。像这样:

@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"

无论您在 SymLoop 中做什么,这总是会产生所需的正确输出

apple
banana
cherry
donut
"Done"
于 2018-12-07T09:26:05.563 回答
3

我这样使用,重要的是变量只有 1 个长度,像 %%a,而不像 %%repo:

for %%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
)
于 2018-07-04T16:42:52.750 回答