2010-08-13
ERRORLEVELについてのメモ (2)
前回の続きです。(前回: id:simply-k:20100812:1281653517)
ERRORLEVELが設定されない場合
説明
コマンドやバッチスクリプトを実行しても、ERRORLEVELが設定されない場合がある。
- ERRORLEVELを設定しないコマンドが存在する。(echo、pause、remなど) *1
- callしたバッチスクリプトが、ERRORLEVELを変更するような処理をせず、さらに終了コードを指定せずに終了した場合
- callしたバッチスクリプトが、callされた段階でのERRORLEVELを終了コードとして指定する場合
動作確認
@echo off rem テスト1 (echo) call :set_errorlevel 10 echo [test-1-1] %ERRORLEVEL% echo [test-1-2] %ERRORLEVEL% rem テスト2 (pause) call :set_errorlevel 20 echo [test-2-1] %ERRORLEVEL% pause < NUL > NUL echo [test-2-2] %ERRORLEVEL% rem テスト3 (rem) call :set_errorlevel 30 echo [test-3-1] %ERRORLEVEL% rem コメント echo [test-3-2] %ERRORLEVEL% rem テスト4 (バッチスクリプト1) call :set_errorlevel 40 echo [test-4-1] %ERRORLEVEL% call :keep_errorlevel_1 echo [test-4-2] %ERRORLEVEL% rem テスト5 (バッチスクリプト2) call :set_errorlevel 50 echo [test-5-1] %ERRORLEVEL% call :keep_errorlevel_2 echo [test-5-2] %ERRORLEVEL% pause exit /b 0 rem ERRORLEVELを設定するサブルーチン :set_errorlevel exit /b %1 rem ERRORLEVELを変更しないサブルーチン1 :keep_errorlevel_1 pause < NUL > NUL exit /b rem ERRORLEVELを変更しないサブルーチン2 :keep_errorlevel_2 set ERROR_CODE=%ERRORLEVEL% copy > NUL exit /b %ERROR_CODE%
実行結果
[test-1-1] 10 [test-1-2] 10 [test-2-1] 20 [test-2-2] 20 [test-3-1] 30 [test-3-2] 30 [test-4-1] 40 [test-4-2] 40 [test-5-1] 50 [test-5-2] 50
ERRORLEVELと遅延展開
説明
if文やfor文の中でERRORLEVELが設定された場合、そのif文やfor文の中で「%ERRORLEVEL%」としても、最新の値を取得できません。遅延展開を有効にした上で、「!ERRORLEVEL!」を使う必要があります。*2 ただし、「if ERRORLEVEL n」を使った場合は、遅延展開の有効・無効に関わらず、常に最新のERRORLEVELで判定されるようです。
動作確認
@echo off rem 初期状態 echo [default] %ERRORLEVEL% rem テスト (遅延展開あり) setlocal EnableDelayedExpansion if 1 == 1 ( call :set_errorlevel 1 echo [test-1-1] %ERRORLEVEL% echo [test-1-2] !ERRORLEVEL! if ERRORLEVEL 1 ( echo [test-1-3] 1以上 ) else ( echo [test-1-3] 1未満 ) ) rem テスト (遅延展開なし) setlocal DisableDelayedExpansion if 1 == 1 ( call :set_errorlevel 1 echo [test-2-1] %ERRORLEVEL% echo [test-2-2] !ERRORLEVEL! if ERRORLEVEL 1 ( echo [test-2-3] 1以上 ) else ( echo [test-2-3] 1未満 ) ) pause exit /b 0 rem ERRORLEVELを設定するサブルーチン :set_errorlevel exit /b %1
実行結果
[default] 0 [test-1-1] 0 [test-1-2] 1 [test-1-3] 1以上 [test-2-1] 0 [test-2-2] !ERRORLEVEL! [test-2-3] 1以上
ERRORLEVELの範囲
説明
ERRORLEVELに設定できる値の範囲は、おそらくWindowsのバージョンによって違うと思います。手元の環境(Windows XP SP3)では、-(231) 〜 231-1でした。*3 「exit /b」で範囲外の値を設定しようとすると、自動的に範囲内の値に変換されるようです。
動作確認
@echo off rem 2^31 - 1 (最大) call :set_errorlevel 2147483647 echo [test-1] %ERRORLEVEL% rem 2^31 (最大 + 1) call :set_errorlevel 2147483648 echo [test-2] %ERRORLEVEL% rem -(2^31) (最小) call :set_errorlevel -2147483648 echo [test-3] %ERRORLEVEL% rem -(2^31 + 1) (最小 - 1) call :set_errorlevel -2147483649 echo [test-4] %ERRORLEVEL% pause exit /b 0 rem ERRORLEVELを設定するサブルーチン :set_errorlevel exit /b %1
実行結果
[test-1] 2147483647 [test-2] -2147483648 [test-3] -2147483648 [test-4] 2147483647
ERRORLEVELについてのメモは、これで終わりです。(前回: id:simply-k:20100812:1281653517)
トラックバック - http://d.hatena.ne.jp/simply-k/20100813/1281675737
リンク元
- 185 http://www.google.co.jp/url?sa=t&rct=j&q=errorlevel&source=web&cd=5&sqi=2&ved=0CE8QFjAE&url=http://d.hatena.ne.jp/simply-k/20100813/1281675737&ei=SB-ETqj5HYmYmQXb4KTvDw&usg=AFQjCNF226-pYzDmT6HJ5eEwxIsck32THw
- 70 http://search.yahoo.co.jp/search?p=ERRORLEVEL&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=&oq=
- 62 http://www.google.co.jp/search?hl=ja&source=hp&q=errorlevel&lr=&aq=f&aqi=&aql=&oq=
- 61 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SUNC_jaJP387JP387&q=if+の中+errorlevel
- 59 http://www.google.co.jp/search?q=errorlevel&ie=utf-8&oe=utf-8&aq=t&hl=ja&client=firefox-a&rlz=1R1GGGL_ja___JP345
- 51 http://www.google.co.jp/url?sa=t&rct=j&q=バッチスクリプト errorlevel 表示&source=web&cd=4&ved=0CDgQFjAD&url=http://d.hatena.ne.jp/simply-k/20100813/128167573
- 43 http://www.google.co.jp/search?hl=ja&q=ERRORLEVEL&lr=lang_ja
- 41 http://www.google.co.jp/url?sa=t&rct=j&q=%errorlevel%&source=web&cd=5&ved=0CFAQFjAE&url=http://d.hatena.ne.jp/simply-k/20100813/1281675737&ei=6wiETrevMaOhiAfypLSXDw&usg=AFQjCNF226-pYzDmT6HJ5eEwxIsck32THw&sig2=SSJHwz2hbtowkka2EqtBSA
- 30 http://www.google.co.jp/search?hl=ja&source=hp&q=errorlevel&gbv=2&oq=ERRORLEVEL&aq=0&aqi=g10&aql=&gs_sm=e&gs_upl=907l3047l0l11250l10l9l0l3l3l0l344l1220l1.2.2.1l6l0
- 29 http://www.google.co.jp/