2013-08-27 4 views
22

ho creato un array come questo:Come eseguire il looping della matrice in batch?

set sources[0]="\\sources\folder1\" 
set sources[1]="\\sources\folder2\" 
set sources[2]="\\sources\folder3\" 
set sources[3]="\\sources\folder4\" 

Ora voglio scorrere questo array:

for %%s in (%sources%) do echo %%s 

non funziona! Sembra che lo script non entri nel ciclo. Perché? Come posso iterare allora?

risposta

26

Se non sapere quanti elementi dell'array hanno (che sembra sia il caso), è possibile utilizzare questo metodo:

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

Nota che gli elementi vengono trattati nel alphabetica l ordine, cioè, se si hanno più di 9 (o 99, ecc) elementi, l'indice deve aver lasciato a zero (s) in elementi 1..9 (o 1..99, etc.)

12

Questo è un modo:

@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

questo non funzionerà senza un'espansione ritardata! –

+5

@LS_dev Oh voi di poca fede. Provalo. :) – foxidrive

+3

Hai ragione! Le mie scuse! –

17

Se non avete bisogno di variabili di ambiente, fare:

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

Questo non è assolutamente utile:/ho chiesto come eseguire un'iterazione attraverso l'array, e hai dato una risposta: "solo non usare l'array!" – aurel

+18

Ti ho dato questo suggerimento perché a volte riconsiderò la mia architettura del programma a seconda delle possibili soluzioni. Immagina di aver creato un array solo per poter iterare attraverso gli oggetti, quindi iterare senza un array precedente potrebbe trasformare quell'array non necessario! –

+0

notate che lo spazio tra 'in' e' ('è importante. Questo non funzionerà:' in ("\\ sources ...)' ma se scrivete con spazio 'in (" \\ sources ...) ' lavoro –

19

un'altra alternativa utilizzando definito e un ciclo che non richiede l'espansione ritardata:

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 
) 

essere sicuri di utilizzare "chiama echo" come eco non funziona se non si dispone delayedexpansion e utilizzare! invece di %%

+1

Mi piace in questo modo, è un po 'più semplice –