このような配列を作成しました:
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
機能しません!スクリプトがループに入っていないようです。何故ですか?どうすれば反復できますか?
配列に含まれる要素の数がわからない場合(そうであるようです)、このメソッドを使用できます。
for /F "tokens=2 delims==" %%s in ('set sources[') do echo %%s
要素はアルファベット順で処理されることに注意してください。つまり、9個(または99個など)を超える要素がある場合、インデックスの要素1..9にはゼロが残っている必要があります。 (または1..99など)
定義済みと遅延拡張を必要としないループを使用する別の代替方法:
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を使用して!の代わりに %%
環境変数が必要ない場合は、次を実行します。
for %%s in ("\\sources\folder1\" "\\sources\folder2\" "\\sources\folder3\" "\\sources\folder4\") do echo %%s
これは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]%%
後世のために:@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
)