プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、バッチファイルの戻り値(ERRORLEVEL)に文字列を設定する
結論から書けば、

set ERRORLEVEL=【文字列】
exit /b

で、設定できることはできます。
ただし、それ以降の処理で

exit /b 【戻り値】

の値が「ERRORLEVEL」に反映されなくなるので、ご注意ください。

無理に「ERRORLEVEL」を使うのではなく、例えば「RETVAL」のような環境変数を用意して
それ経由で受け渡すのが無難だと思います。

それでは詳細を書いていきますね。

例えば

@echo off

REM 関数呼び出し
call :lbl_func1 param1

echo %ERRORLEVEL%
pause

REM 関数定義
:lbl_func1

echo %1

exit /b 0

のような書き方をすることで、バッチファイルで関数っぽいものを作れます。

:lbl_func1

echo %1

exit /b 0

の部分が関数定義扱いで

call :lbl_func1 param1

が関数呼び出し扱いです。
「param1」は関数に渡すパラメータですよ。

このラベルを使ったなんちゃって関数ですが、
戻り値っぽいものを返すこともできるのです。
関数側で

exit /b 【戻り値】

のように書き、呼び出し側で変数「ERRORLEVEL」を参照することで、
関数から呼出元へ任意の値を返すことができます。

ふーん、なるほどね(--)

そこで私は、ふと疑問を覚えました。

これって文字列も返せるの(--?

「ERRORLEVEL」って、元々想定されている用途としては、
正常終了であれば「0」、異常終了であれば「1」以上?が設定されるはずです。

数字はいけそうな気がしますが、文字列も設定できますかね(--?

早速、こんなサンプルを作って実行してみましたφ(--)

@echo off

call :lbl_hoge

echo %ERRORLEVEL%

pause

:lbl_hoge

exit /b hoge

結果はこんな感じになりましたφ(--)

0
続行するには何かキーを押してください . . .

「0」が設定されている……というよりは「hoge」が無視されて

exit /b

を実行したのと同じ結果になっているっぽいですね。
既に「ERRORLEVEL」が「1」の状態で実行したら

1
続行するには何かキーを押してください . . .

になりました。

なるほど(--)
じゃあ、数字と文字列が混ざっていたらどうなるのかな(--?

試しに

exit /b hoge



exit /b 3hoge

にしてみたところ「ERRORLEVEL」には「3」が設定されました。
おぉ、数字部分だけ反映された。

さらに

exit /b ho4ge



exit /b hoge5

を実行しても「ERRORLEVEL」は「3」のままだったので、
文字列が出てきた時点(サンプルでは「hoge」の「h」が出た時点)で、
解釈を終わりにしているのだろうと推測しています。

ここまでを見る限り「exit /b」を使って文字列を返却することはできなさそうですね。
では

set ERRORLEVEL=【文字列】

を使って「ERRORLEVEL」に対して強引に文字列を設定したらどうなるのでしょう(--?

わたし、気になります。

早速、こんなサンプルを作って実行してみましたφ(--)

@echo off

call :lbl_hoge

echo %ERRORLEVEL%

pause

:lbl_hoge

set ERRORLEVEL=hoge
exit /b

結果は、こうなりましたφ(--)

hoge
続行するには何かキーを押してください . . .

おー!
「ERRORLEVEL」に文字列「hoge」が設定されました。
これで、ラベルを使った関数もどきから、戻り値として文字列を返却できますね。

やったね\(≧▽≦)/

そんなふうに考えていた時期が俺にもありました。

このやり方、いろいろ試してみたら致命的っぽい弱点がありましてね(^^ゞ
以降

exit /b 【戻り値】

の値が「ERRORLEVEL」に反映されなくなっちゃうのです。
例えば、こんなコードを実行するとφ(--)

@echo off

call :lbl_hoge

echo %ERRORLEVEL%

pause

:lbl_hoge

set ERRORLEVEL=hoge

exit /b 3

こんな結果になりますφ(--)

hoge
続行するには何かキーを押してください . . .

「exit /b 3」の「3」が反映されないのです。

バッチファイルを分けてこんなんやってもφ(--)

■test_main.bat
@echo off

call test_sub.bat
echo %ERRORLEVEL%

pause

■test_sub.bat
@echo off

call :lbl_hoge
echo %ERRORLEVEL%

exit /b 1

:lbl_hoge

set ERRORLEVEL=hoge

exit /b 3

表示されるのは「set」コマンドで設定した値ですφ(--)

hoge
hoge

続行するには何かキーを押してください . . .

こんなんだったら、素直に戻り値用の環境変数を用意した方が良いですね。
こんな感じにした方が無難そうですφ(--)

@echo off

call :lbl_hoge

echo %RETVAL%

pause

:lbl_hoge

set RETVAL=hoge
exit /b

ちなみに、バッチファイルを分けても大丈夫でした。
一連の流れで実行すれば、きちんと値が受け渡されます。

長くなったので、最後にもう一度まとめておきますね。

exit /b 【戻り値】

で戻り値(ERRORLEVEL)に文字列は設定できません。

set ERRORLEVEL=【文字列】
exit /b

で、戻り値(ERRORLEVEL)に文字列を設定できます。
ただし、それ以降の

exit /b 【戻り値】

の値【戻り値】が「ERRORLEVEL」に反映されなくなります。

「ERRORLEVEL」に文字列を設定することを考えるのではなく、
戻り値用の環境変数を別に用意するのが現実的でしょう。

身も蓋も無い結論ですが、そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事