wake-up-neo.com

Wie kann man das Array im Stapel durchlaufen?

Ich habe ein Array wie folgt erstellt:

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

Jetzt möchte ich dieses Array durchlaufen:

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

Es geht nicht! Es scheint, dass das Skript nicht in die Schleife geht. Warum das? Wie kann ich dann iterieren?

26
aurel

Wenn Sie nicht wissen, wie viele Elemente das Array hat (das scheint der Fall zu sein), können Sie diese Methode verwenden:

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

Beachten Sie, dass die Elemente in alphabetischer Reihenfolge verarbeitet werden. Wenn Sie also mehr als 9 (oder 99 usw.) Elemente haben, muss der Index in Element 1..9 (oder 1) eine Null (s) gelassen haben ..99 usw.)

28
Aacini

Eine andere Alternative, die definiert verwendet und eine Schleife, die keine verzögerte Erweiterung erfordert:

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
)

Stellen Sie sicher, dass Sie "Call Echo" verwenden, da das Echo nur dann funktioniert, wenn Sie die Erweiterung und Verwendung verzögert haben! anstatt %%

30
Dss

Wenn Sie keine Umgebungsvariablen benötigen, führen Sie folgende Schritte aus:

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

Dies ist eine Möglichkeit:

@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

ich benutze so, was wichtig ist, dass die Variable nur eine Länge hat, wie %% a und nicht wie %% 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

Für die Nachwelt: Ich wollte nur eine geringfügige Änderung an @dss vorschlagen, ansonsten gute Antwort.

In der aktuellen Struktur führt die DEFINED-Prüfung zu einer unerwarteten Ausgabe, wenn Sie den Wert von Arr einer temporären Variablen innerhalb der Schleife zuweisen:

Beispiel:

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

Dies erzeugt tatsächlich die folgende fehlerhafte -Ausgabe

donut
Apple
banana
cherry

Das letzte Element wird zuerst gedruckt. Um das Problem zu beheben, ist es einfacher, die DEFINED-Prüfung zu invertieren, damit sie über die Schleife springt, wenn das Array fertig ist, anstatt es auszuführen. So wie:

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

Unabhängig davon, was Sie in SymLoop tun, wird immer die gewünschte Ausgabe von correct erzeugt 

Apple
banana
cherry
donut
"Done"