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?
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.)
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 %%
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
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]%%
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
)
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"