如何批量循环遍历数组?
Posted
技术标签:
【中文标题】如何批量循环遍历数组?【英文标题】:How to loop through array in batch? 【发布时间】:2013-08-30 00:11:10 【问题描述】:我创建了一个这样的数组:
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
这行不通!似乎脚本没有进入循环。这是为什么?那我该如何迭代呢?
【问题讨论】:
【参考方案1】:另一个使用已定义和不需要延迟扩展的循环的替代方案:
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
)
请确保您使用“呼叫回声”,因为回声将不起作用,除非您延迟扩展并使用!而不是 %%
【讨论】:
我喜欢这种方式。它有点简单【参考方案2】:如果你不知道数组有多少个元素(似乎是这样),你可以使用这个方法:
for /F "tokens=2 delims==" %%s in ('set sources[') do echo %%s
请注意,元素将按字母顺序进行处理,也就是说,如果您有超过 9 个(或 99 个等)元素,则索引必须在元素 1 中留下零..9(或 1..99 等)
【讨论】:
【参考方案3】:如果您不需要环境变量,请执行以下操作:
for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s
【讨论】:
这绝对没有帮助:/我问如何遍历数组,你给出了答案:“只是不要使用数组!” 我只给你这个建议是因为有时我会根据可能的解决方案重新考虑我的程序架构。想象一下,您创建数组只是为了能够迭代项目,然后在没有前一个数组的情况下进行迭代将使该数组变得不需要! 请注意in
和(
之间的空格很重要。这不起作用:in("\\sources...)
但如果你用空格写 in ("\\sources...)
会起作用【参考方案4】:
这是一种方式:
@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]%%
【讨论】:
@LS_dev 哦,你这个小信仰。试试吧。 :) 你说得对,我很抱歉!顺便说一句,无论数组长度如何,都可以进行动态迭代。【参考方案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"
【讨论】:
第一个示例中的问题只是将echo %var%
更改为 call echo %%var%%
并且它按预期工作。或者更好的是,使用延迟扩展
@jeb 这是问题的症结所在,循环内的代码的行为与您在普通 bat 脚本中的预期不同。您需要以不同的方式称呼事物。从长远来看,这将是一个维护难题。最好确保它按用户预期工作。
它的行为与批处理脚本中的预期完全一样!重要的是要知道how batch works,而不是规避您不理解的构造。而且你不能绕过所有的括号块。【参考方案6】:
我这样用,重要的是变量只有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
)
【讨论】:
以上是关于如何批量循环遍历数组?的主要内容,如果未能解决你的问题,请参考以下文章