web-dev-qa-db-fra.com

Comment passer en boucle dans un tableau?

J'ai créé un tableau comme celui-ci:

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

Maintenant, je veux parcourir ce tableau:

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

Ça ne marche pas! Il semble que le script ne va pas dans la boucle. Pourquoi donc? Comment puis-je itérer alors?

26
aurel

Si vous ne savez pas combien d'éléments le tableau a (cela semble être le cas), vous pouvez utiliser cette méthode:

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

Notez que les éléments seront traités dans ordre alphabétique , c’est-à-dire que si vous avez plus de 9 (ou 99, etc.) éléments, l’index doit avoir laissé zéro (s) dans les éléments 1..9 (ou 1 ..99, etc.)

28
Aacini

Une autre alternative utilisant défini et une boucle ne nécessitant pas d'expansion retardée:

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
)

Assurez-vous d'utiliser "call echo", car l'écho ne fonctionnera que si vous avez une expansion et une utilisation différées! au lieu de %%

30
Dss

Si vous n'avez pas besoin de variables d'environnement, faites:

for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s
20
LS_ᴅᴇᴠ

C'est une façon:

@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]%%
14
foxidrive

j'utilise comme ça, ce qui est important, c'est que la variable a seulement une longueur, comme %% a, et pas comme %% 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
)
1
Patrik Laszlo

Pour la postérité : Je voulais juste proposer une légère modification sur @dss sinon excellente réponse.

Dans la structure actuelle, la manière dont la vérification DEFINED est effectuée provoque une sortie inattendue lorsque vous affectez la valeur d'Arr à une variable temporaire à l'intérieur de la boucle:

Exemple:

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

Ceci produit réellement le résultat incorrect output

donut
Apple
banana
cherry

Le dernier élément est imprimé en premier . Pour résoudre ce problème, il est plus simple d’inverser le contrôle DEFINED pour le faire sauter par-dessus la boucle lorsque nous en avons terminé avec le tableau au lieu de l’exécuter. Ainsi:

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

Ceci indépendamment de ce que vous faites dans SymLoop produit toujours le résultat souhaité correct  

Apple
banana
cherry
donut
"Done"
1