web-dev-qa-db-ja.com

バッチで配列をループする方法は?

このような配列を作成しました:

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

機能しません!スクリプトがループに入っていないようです。何故ですか?どうすれば反復できますか?

32
aurel

配列に含まれる要素の数がわからない場合(そうであるようです)、このメソッドを使用できます。

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

要素はアルファベット順で処理されることに注意してください。つまり、9個(または99個など)を超える要素がある場合、インデックスの要素1..9にはゼロが残っている必要があります。 (または1..99など)

32
Aacini

定義済みと遅延拡張を必要としないループを使用する別の代替方法:

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を使用して!の代わりに %%

33
Dss

環境変数が必要ない場合は、次を実行します。

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

これは1つの方法です。

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

後世のために:@dssにわずかな修正を提案したかったのです。

現在の構造では、Arrの値をループ内の一時変数に割り当てると、DEFINEDチェックの実行方法によって予期しない出力が発生します。

例:

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

これにより、実際には以下が生成されますincorrect output

donut
Apple
banana
cherry

最後の要素が最初に印刷されます。これを修正するには、配列を実行する代わりに処理が完了したときに、DEFINEDチェックを反転してループをジャンプさせる方が簡単です。そのようです:

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

これは、SymLoop内で何をするかに関係なく、常に目的の正しい出力を生成します

Apple
banana
cherry
donut
"Done"

私はこのように使用しますが、重要なのは、変数の長さが%% aのように1%のみであり、%% 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