9

この問題に2回遭遇した後、ここに投稿して、回避方法を誰かが知っているかどうかを確認したいと思いました.

を使用してネストされたループから抜け出せないようですgoto。内側のループから抜け出すと、内側の閉じているループに到達しなかったため、括弧が一致しないように見えるためです。

これを非常に単純な例に絞り込みました

for %%a in (1,2,3) do (
for %%b in (4,5,6) do (
echo Breaking
goto :BREAK
)
:BREAK
)

これにより、エラーが発生します

) was unexpected at this time.

余分な括弧を追加すると問題が解決するかもしれないと思いましたが、条件付きのブレークの場合、それは同じ問題です。

ifとを使用した条件付きブレークであっても、内側のループから外側のループに戻る簡単な代替手段はありますelseか?

4

6 に答える 6

13

内側のループをラベルに配置してブレークします。

for %%a in (1, 2, 3) DO (

   call :innerloop 
)
:innerloop
for %%b in (4, 5, 6) DO (
  if %%b==<something> (
    echo    break
    goto :break
  )

)
:break
于 2013-01-28T13:53:25.993 に答える
6

FORに関連付けられた制御変数を使用して、ブレーク後の残りの反復を省略することもできます。

@echo off
for %%a in (1,2,3) do (
   echo Top-level loop: %%a
   set break=
   for %%b in (4,5,6) do if not defined break (
      echo Nested loop: %%a-%%b
      if %%b == 4 (
         echo Breaking
         set break=yes
      )
   )
)

このメソッドは、ネストされたfor-bodyのコードを元の場所に保持し、for-body内の複数のポイントにブレークを簡単に設定できるようにします。

アントニオ

于 2013-02-02T01:37:35.813 に答える
0

DOS BAT へようこそ。固有の不具合がすべて含まれています。元来、DOS BAT はネストされたループ _at _all をサポートしていませんでした。それらはまだ正確には機能しません。すべての不具合、奇妙さ、矛盾を回避するには、代わりに Microsoft PowerShell を使用してください。

「call」ステートメントによって呼び出される内部サブルーチンを使用するようにスクリプトを再構築することにより、ネストされたループを回避できます。インライン ブロックにアクションを含めるのではなく、サブルーチンを呼び出す単一のステートメントを各 'for' に実行させます。

密接に関連する問題は、トップ レベルのループからの抜け出しでさえ、かなり頻繁に機能しないように見えることです。これは、'( ... )' という便利な構文が元の言語から数年後に BAT 言語に追加されたため、残りの言語ではうまく機能しません。特に、'( ... )' 内の _everything は、ブロックが最初に入力されたときに一度だけ置換されます。'if %NOMORE%==yes ...' のような構造は、%NOMORE% の値がブロックに入ったときに 1 回しか置換されず、実行されるたびに期待どおりに置換されないため、誤動作します。したがって、後でループの内外で値が変更された場合、「if」テストは新しい値を認識しません。

この問題を回避する 1 つの方法は、BAT ファイルをぎこちなく再構築することです。一連の「goto」を使用して「( ... )」を使用しないか、不要なサブルーチンを多数呼び出すか、またはその両方を使用します。 -- これは、ブロックの構文上の利便性が導入される前に、BAT ワラーが何年にもわたって行ってきたことです (それに付随する奇妙な動作を伴います)。この問題を回避するより良い方法は、「遅延拡張」を使用することです (つまり、「if %NOMORE%==yes ...」ではなく「if !NOMORE!==yes ...」)。[お使いの Windows のバージョンは遅延展開をサポートしている必要があり、setlocal ステートメントで有効にする必要があります。]


新しい情報とコメントへの対応のため、大幅に編集されました。(詳細については、最初のコメントを参照してください。)

于 2021-08-04T06:23:39.863 に答える
-1

あなたの要件についてさらに情報を提供していただけますか?それまでの間、要件に合う場合はこれを試すことができます。さらに必要な場合は、私に知らせてください。

@echo off
for %%a in (1,2,3) do ( 
for %%b in (4,5,6) do (
echo Breaking
goto Break 
)
)
:Break
于 2013-01-28T13:25:56.450 に答える