2016-08-16 6 views
3

私はこのような数字を含む配列を通してループするバッチファイルを作ろうとしています:1 2 3 4 5 ループの最初の繰り返しでは、トークン1と2を選びます。 2番目の2と3、3番目の3と4のように続きます。forループ内のトークンとしての変数

私は使用すべきだと思います!最初と2番目の変数では、私はトークンとして使用します。

%を使用した場合は、カウントアップされません 変数トークン以外のものはすべて動作します。いずれも、最初のFOR/Fと同様ですが、 ?。任意のヘルプや提案が大幅にappriciatedする方法1 knowes これは、との一部イムstruggelingです:

setlocal EnableDelayedExpansion 
set first=1 
set second=2 
set N=4 
set output="1 2 3 4 5" 
set output=%output:"=% 

for /L %%a in (1,1,%N%) do (
    if !counter! equ active (
     set /a first+=1 
     set /a second+=1 
    ) 
     FOR /F "tokens=!first!" %%a IN ("%output%") DO (
     set nr1=%%a 
     ) 
     FOR /F "tokens=%second%" %%a IN ("%output%") DO (
     set nr2=%%a 
     ) 

    echo nr1 var: !nr1! 
    echo nr2 var: !nr2! 
    echo counter f: !first! 
    echo counter s: !second! 
    set counter=active 
) 

答えて

1

することはできませんfor /Fのオプション文字列で遅延拡大変数を使用どちらも、あなたがそのために他のfor変数を使用することはできません。しかし、通常の(直ちに)展開された変数を使用することができます。例えば、%1のような引数参照を使用することもできます。

だからあなたの問題のために素敵な回避策は、サブ・ルーチンでfor /Fループを配置し、このような引数として遅れ拡大した変数、でメインプログラムにcallを使用することです:

@echo off 
setlocal EnableDelayedExpansion 
set /A first=1 
set /A second=2 
set /A N=4 
set "output=1 2 3 4 5" 

set "counter=" 
for /L %%a in (1,1,%N%) do (
    if defined counter (
     set /A first+=1 
     set /A second+=1 
    ) 

    call :SUB !first! !second! 

    echo nr1 var: !nr1! 
    echo nr2 var: !nr2! 
    echo counter f: !first! 
    echo counter s: !second! 
    set "counter=active" 
) 
endlocal 
exit /B 

:SUB val_token1 val_token2 
for /F "tokens=%~1,%~2" %%a in ("%output%") do (
    if %~1 LSS %~2 (
     set "nr1=%%a" 
     set "nr2=%%b" 
    ) else if %~1 GTR %~2 (
     set "nr1=%%b" 
     set "nr2=%%a" 
    ) else (
     set "nr1=%%a" 
     set "nr2=%%a" 
    ) 
) 
exit /B 

ので、あなたは同じ文字列からトークンを抽出しているので、私はあなたの2つのfor /Fループを1つにまとめました。サブルーチン:SUBfor /Fループのifブロックは、2番目のトークン番号が必ずしも最初のトークン番号より大きいわけではない場合があります。しかし、それが保証できるならば、for /Fループはset "nr1=%%a"set "nr2=%%b"だけを含む必要があります。

関連する問題