2017-04-05 8 views
2

私が何を求めているのかを説明するために、コードを少し作った。ダブルの中でgotoを使うとどうなりますか?

for /l %%i in (1,1,3) do (
    :break 
    for /l %%j in (1,1,3) do (
     if "%%i,%%j" equ "2,2" goto :break 
     echo(%%i,%%j 
    ) 
) 

上記のコードから予想される出力は次のようになります:のは、私は以下の持っていると言う

1,1 
1,2 
1,3 
2,1 
%i,1 
%i,2 
%i,3 

これを:

1,1 
1,2 
1,3 
2,1 
3,1 
3,2 
3,3 

しかし、その代わりに、私が得る結果は以下のとおりです。ほんの一例ですが、私が使用しているすべての種類の二重ループforで起こります。だから、gotoが実際に何をしてくれるのかは誰にでも分かります。for?前もって感謝します!

答えて

4

GOTOはfor(およびif)コンテキストを中断します。したがって、最初のgoto実行の後、外側ループの実行は中断されます。

@echo off 

for /l %%i in (1,1,3) do (
    call ::funct 
) 


exit /b %errorlevel% 

:funct 

    for /l %%j in (1,1,3) do (
     rem :: 
     rem :: notice that %%i is accessible inside the FOR 
     rem :: 
     if "%%i,%%j" equ "2,2" goto break 
     echo(%%i,%%j 
    ) 
    :break 

exit /b %errorlevel% 
+0

が完全に理解される:関数内FORとして引き続き使用することができる回避策は次のサブルーチン呼び出しでトークンの外側へのアクセスを有します。ありがとう! – dcg

+0

それは面白いです。 2,2および2,3は決してエコーではない。私はDosTipsについての議論から、あなたが決してFOR/Lコマンドを破ることはできないと思った。 – Squashman

関連する問題