2013-08-27 25 views
22

我創建了一個這樣的數組:如何批量循環數組?

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 

它不工作!看來腳本不會進入循環。這是爲什麼?我如何迭代呢?

回答

26

如果你不知道數組有多少元素有(這似乎是的情況下),可以使用這種方法:

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

注意,元件將在alphabetica被處理l order,也就是說,如果您有超過9個(或99個等)元素,則索引必須在元素1..9(或1..99等)中保留零(s)

12

這是一種方式:

@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]%% 
+0

這不會沒有延遲擴展工作! –

+5

@LS_dev哦,你們是小信仰。嘗試一下。 :) – foxidrive

+3

你是對的!我道歉! –

17

如果你不需要的環境變量,這樣做:

for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s 
+8

這絕對沒有幫助:/我問了如何遍歷數組,並給出了一個答案:「只是不要使用數組!」 – aurel

+18

我只給你這個建議,因爲有時我會根據可能的解決方案重新考慮我的程序體系結構。想象一下,你已經創建了數組只是爲了能夠迭代項目,然後迭代而沒有以前的數組會不需要的數組! –

+0

注意'in'和'('之間的空格是重要的,這不會起作用:'in(「\\ sources ...)'但是如果你用空格寫入(」\\ sources ...)'會工作 –

19

另一種方法使用已定義的,並且不需要延遲擴展循環:

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 
) 

確保您使用「呼叫回聲」回聲,除非你有delayedexpansion和使用都不行!而不是%%

+1

我喜歡這種方式,它更簡單一點 –