FOR /L %%i IN (1,1,100) DO (
choice
echo %ErrorLevel%
)
%ErrorLevel%
0
どの選択肢を入力しても常にです。
FOR /L %%i IN (1,1,100) DO (
choice
echo %ErrorLevel%
)
%ErrorLevel%
0
どの選択肢を入力しても常にです。
エラーレベルを間違った方法でチェックしています。
このような括弧のペア内の変数とコマンド...
(
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