LoginSignup
1
2

More than 5 years have passed since last update.

新人あるある(Dosバッチお作法編 第二章)

Posted at

未来の新人さんへおくるDosバッチお作法第二弾行きたいと思います

前回はechoについてちょろっと語りました

ログを残す際でおそらく詰まるかもねってことで書きました
今回はログもしかることながらおそらくみんなが詰まっただろう%ERRORLEVEL%について語って変数や戻り値に関して紹介していこうかなって思います

そもそも%ERRORLEVEL%ってなんぞっていう方向けにあっさり紹介
処理が正常終了したか異常終了したかの戻り値を数字にして教えてくれるイケメンのこと
こいつは結構お世話になるので覚えておいてください

では次に戻り値ってなんやねんって思う人多いと思います
研修中の私もそんな感じでした

戻り値とは処理が終わった際に結果を呼び出し元に渡す値のこと
たとえるなら「Aさんから頼まれたプリントのコピーが終わりました」って言って
コピーしたものを渡すって感じかな

プログラミングでは戻り値がないと大変です
処理を配列に入れられなかったりエラーメッセージが出なくてどこでエラーなのかがわからんってことにもなる…
あえて返さないって手もあるらしいけど教えられてないしそんな機会あるのか謎です

ではざっくり戻り値と%ERRORLEVEL%に関して簡単に説明したので
こいつの使い方について(超重要、メモの準備はいいかね)

%ERRORLEVEL%は直前の処理に対してのみ戻り値を入れてくれるものです
どういうことかわかんねえよって思うかと
最初これに私もつまづきましたからね

つまりこゆこと

echo 処理1を開始します
echo 処理1
%ERRORLEVEL%
echo 処理1を終了します

こうやって書かないと処理1の戻り値が入ってきてくれないわけ
これが複数のプログラムをバッチファイルから動かそうと思った際に困るってわけ

つまり
echo 処理1を開始します
echo 処理1
echo 処理1を終了します
echo 処理2を開始します
echo 処理2
echo 処理2を終了します
%ERRORLEVEL%
って書いちゃうとどの行に対して%ERRORLEVEL%の戻り値が入るでしょう

正解はecho 処理2を終了しますっていう処理に対しての戻り値が入ってきちゃいます
まとめて保持はできないよってことだね

カンのいい新人は変数であるので一つしか値を持つことができないって気づくやつがいると思う

なので正しくは
echo 処理1
%ERRORLLEVEL%
echo 処理2
%ERRORLEVEL%って書こうねってこと
でもこれじゃあ戻り値は一つしかないのにどやって区別するのって話になるよね

こうするといい

echo 処理1を開始します
echo 処理1
%ERRORLEVEL%
if %ERRORLEVEL%==0 (
echo 処理1が正常に終了しました
echo 処理2に移行します
echo 処理2
%ERRORLEVEL%
if %ERRORLEVEL%==0 (
echo 処理が正常に終了しました
exit /b
  ) else (
goto :Error
)
) else (
goto :Error
)

:Error

echo 処理が正常に終了できませんでした
exit /b

説明しないといけないことが2点
goto文とexit /bについて
goto文はラベルっていう技で処理が共通しているときに処理を別にまとめておいてそこへ飛んでくださいって命令するやつ
ここでは異常終了が発生したらその場でプログラムを終了させるようにしてるってこと
例えば処理1で異常終了したら処理2にはいかないし処理1が正常終了して処理2が異常終了だった場合は処理2がどういうエラーなのかがわかるっていう作戦

ラベルはいろいろ使うこと多いので使えるようにしておくとすっきりするよ

次はexit /bについて
これはDosコマンドのexit と オプションの/bの組み合わせ
exitコマンドで処理を終了する際に%ERRORLEVEL%の戻り値を返してオプションの/bで現在のバッチスクリプトを指定するってことしてます

つまり現在のバッチスクリプトを戻り値出して終了するよってこと

まって、バッチファイルってすぐcmdウィンドウ閉じちゃうじゃん
どこでその戻り値を確認すればいいのってことになるけど
カギは起動の仕方にありました

これも上司に教えてもらいました
①cmd起動
②start "Dosバッチ"

これだけ
このstartコマンドは別のウィンドウを開けてDosバッチを起動しまっせっていうコマンド
こうすることでログ見なくても実行結果がすぐわかるっていう開発で必須の知識

いろいろ新しいことも加えてしまって申し訳なかったがこういったことはよく出てくるし
知らないとググって定時来ちゃって残業っていうこともあるから各自で調べて理解を深めてください

あくまでお作法の紹介ってかんじなので

次回は今回あまり話せなかった変数についてのお作法紹介と行きますか

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2