3
FOR /L %%i IN (1,1,100) DO (
    choice
    echo %ErrorLevel%
    )

%ErrorLevel%0どの選択肢を入力しても常にです。

4

1 に答える 1

7

エラーレベルを間違った方法でチェックしています。

このような括弧のペア内の変数とコマンド...

(
  command1
  command2
  command3
)

...このように、単一行で実行されたように動作しcommand1 & command2 & command3ます。

コマンドラインでこれを試してください。

choice & echo %errorlevel%

上記のコマンドを複数回実行すると、現在のエラーレベルではなく、以前のエラーレベルがエコーされることがわかります。

または、コマンドラインでこれを試してください:

set x=yes
( echo %x%
  set x=no
  echo %x%
)

出力は次のようになります。

yes
yes

入ったかのようにecho %x% & set x=no& echo %x%

システムには変数を更新する時間がないので、私はそれを考えるのが好きです。(ただし、変数は行全体が実行された後にのみ更新されると言ったほうが正確です。) これは、エラーレベルだけでなく、すべての変数に当てはまります。

ループ内の変数を正常に動作させるには、このようにバッチ ファイル (または外部バッチ ファイル) に内部ラベルをfor付ける必要があります。call

@echo off
  FOR /L %%i IN (1,1,100) DO call :dostuff %%i
goto :eof

:dostuff
  choice /m "Question #%1"
  echo %ErrorLevel%

====================================以下の質問の解決策

別の方法として、Microsoft はブラケット ペア内の変数の現在の値にアクセスする方法を作成しました。コード行が 2 回解釈されるため、「遅延拡張」と呼ばれます。

このモードを有効にするにsetlocalは、スイッチを指定してコマンドを使用enableDelayedExpansionし、! で変数にアクセスします。こういうキャラ。参考endlocalまでにエフェクトをオフにします。

@echo off
setlocal enableDelayedExpansion
for /L %%i in (1,1,100) do (
  choice /m "Question #%%i"
  echo !ErrorLevel!
)
endlocal

ご覧のとおり、最初の例はコーディングが簡単ですが、2 番目の例は読みやすいです。どちらの方法を使用するかは、ニーズと再利用性によって異なります。

このコマンドには、コマンド後に終了する一時変数setlocalを作成する効果もあります。これは、バッチ ファイルの終了時に変数を削除する必要がなく、実行中に変更した変数を元の値に戻すことを意味します。既存の変数を「踏む」ことを心配する必要がないため、これは素晴らしいことです。endlocal

于 2012-08-29T17:43:19.257 に答える