• ベストアンサー

バッチのcallの使い方で、これって合ってるか教えてください。

下記のようなバッチスクリプトを作りました。 ************************************** FC AAA.txt BBB.txt if not %errorlevel% EQU 0 call :ERR-SEC 10 FC CCC.txt DDD.txt if not %errorlevel% EQU 0 call :ERR-SEC 11 exit 0 :ERR-SEC echo 終了コード:[%1] > EEE.log exit %1 ************************************** 気にしているのはcallの使い方です。 どこの処理でエラーが起きたかあとでわかるように、 callでエラーセクションをパラメータを渡して呼び出し、 引数をログ出力と終了値に使用しています。 callは本来、2回終わらせる必要があると参考書に記載されていたのですが、 このバッチではexitで無理やり終わらせています。 このような使い方は問題ないでしょうか? なにか気になる点があればぜひ教えてください。 よろしくお願いします。 ちなみにOSはWindows2003Serverです。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.1

コマンドプロンプトから起動すると、exitでコマンドプロンプトごと終了します。また、他のスクリプトからcallで呼ぶとexitで全体が終了します。 そういう使い方をしないのなら問題ないです。 gotoにする手もありますね。 FC AAA.txt BBB.txt if not %errorlevel% EQU 0 set CC=10&goto ERR-SEC FC CCC.txt DDD.txt if not %errorlevel% EQU 0 set CC=11&goto ERR-SEC goto :EOF :ERR-SEC echo 終了コード:[%CC%] > EEE.log goto :EOF

その他の回答 (2)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.3

> このバッチではexitで無理やり終わらせています。 > このような使い方は問題ないでしょうか? あれ?問題あると思ったから質問したのだと思ってた^^; No.1で言われているとおり、 他のスクリプトからそのスクリプトを呼んだときに そのスクリプトが呼び出し元のスクリプトまで終了させるので、 それを問題と思うかどうかですね。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

exit ではなく exit /b を使ってください。

関連するQ&A

  • バッチ・ログファイルへの出力

    <子シェル.bat>に以下のように正常/異常のEXITコードを出力させてます。 コマンド if %ERRORLEVEL% EQU 0 exit 0 if %ERRORLEVEL% NEQ 0 exit 100 <<親シェル.bat>>より上記子シェルをCallして正常/異常時にログファイルへメッセージを出力しようと思っています。 下記のように書いても正常/異常終了と関係なくログファイルへの出力はされませんでした。子シェルの実行自体はされてます。。 call 子シェル.bat IF %ERRORLEVEL% EQU 0 echo "OK" >>%logfile% 2>&1 IF %ERRORLEVEL% NEQ 0 echo "NG" >>%logfile% 2>&1 何が原因なのでしょうか・・・

  • バッチ処理について

    お世話になります。 バッチファイルを作成して、サーバー間でファイルのコピーを行おうと思ってます。 サーバーA:win2003server standerdEditon サーバーB:win2003server standerdEditon サーバーC:win2003server R2 standerdEditon(ServicePack1) A、Bからnet useコマンドでCをマウントしてます A→Cのコピーは大丈夫なのですが、 B→Cでは頻繁にnet useコマンドで失敗します。 サーバーBのバッチファイル if not exist P:\ net use P: \\serverC\test >> log.txt if %ERRORLEVEL% neq 0 echo エラー発生 ERRORLEVEL=%ERRORLEVEL% >> log.txt &goto END if ERRORLEVEL 0 echo 正常終了 >> log.txt のようにしているのですが、エラーなのに、 「エラー発生」がログに出ずに終了してます。 「正常終了」も 「エラー発生」もログに出ないということは、if文で評価されてないように 思うのですが、&gotoで次の処理を飛ばしているので、終了のログは出てます。 説明が不足しておりましたら追加させていただきますので、 なぜこの現象が発生するのかお知恵をお貸しいただければ幸いです。 よろしくお願いします。

  • バッチファイル(.bat)へWSH(.wsf)のエラーコードの返し方について

    はじめまして、kiwi88と申します。 バッチファイル(.bat)からwshスクリプト(.wsf)を呼び出すプログラムを作成しました。 そこで、wshスクリプトで実行されたエラーコードを呼び出しもとのバッチファイル(.bat)に返すことはできますでしょうか。 以下はバッチファイル(.bat)からwshスクリプト(.wsf)を呼び出す箇所のソースです。 ◆バッチファイル(test.bat)◆ ---------------------------------------- ~※処理内容省略~ cscript test.wsf //nologo //Job:wshscript > batch.log IF %ERRORLEVEL% NEQ 0 GOTO ERR exit :ERR set ret=%ERRORLEVEL% echo ****** [%:ERRORLEVEL=%ret%] ****** > err.txt exit %ret% ---------------------------------------- 以下はwshスクリプト(.wsf)のエラーコードを返す箇所のソースです。 ◆wshスクリプト(test.wsf)◆ ---------------------------------------- <job id = "wshscript"> <script language = "VBScript"> <![CDATA[ Option Explicit Function Main() ~※処理内容省略~ err = Err.Number Main = err End Function ]]> </script> </job> ---------------------------------------- 長くなってしまい、申し訳ありませんが、 ご教授願えますでしょうか。 宜しくお願いいたします。

  • 終了コード errorlevel の考え方について

    こんばんは。 OSはWindowsXP Proを使っています。 テキストファイルに書いてある値を 終了コードにするバッチファイルを作成しました。 以下の2ファイルを同じディレクトリに保存します。 test.txt ┌--------┐   1 └--------┘ test.bat ┌---------------------------------------┐   @echo off   find "0" test.txt   if not errorlevel 1 exit /b 0   find "1" test.txt   if not errorlevel 1 exit /b 1   echo テキストは0~1の値ではありません。   exit /b 2 └---------------------------------------┘ この状態で次のように実行します (1) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT 1 (2) C:\>echo %errorlevel% 1 (3) C:\>set errorlevel=0 (4) C:\>echo %errorlevel% 0 ※ここでtest.txtの中の数字を2にします。 (5) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT テキストは0~1の値ではありません。 (6) C:\>echo %errorlevel% 0 (7) C:\>set errorlevel= (8) C:\>echo %errorlevel% 2 となります。 (2)の結果から、(1)で実行した「exit /b 1」でerrorlevelに1が格納されることが判ります。 しかし、(6)の結果から、(3)で実行した「set errorlevel=0」が (5)で実行した「exit /b 2」より優先されていることが判ります。 しかし(7)でerrorlevelの値を消去したように思われますが、 (8)の結果から、(3)のセットを消去しつつ(5)で実行した「exit /b 2」を記憶しているように見えます。 この挙動について、どのように理解すれば良いのでしょうか。 また「exit /b ○」と「set errorlevel=○」でセットする違いについて教えて頂ければと思います。 お願いします。

  • バッチファイルでのスペースの入力

    コマンドプロンプトのバッチファイルで・・・ set /p menu= if %menu%. EQU . goto err if %menu% EQU cd /usr/local goto next if %menu% EQU exit goto end で、cd /usr/local を入力させたいのですが上手くいきません。(cdの後のスペースが問題なのですが) ””で囲んでもダメでした。 スペースを含んだ文を入力させるset文の方法を教えてください。

  • FOR文内でサブルーチンをCALLした際の、ERRORLEVELの取得

    ファイルをコピーしてからFOR文により6回処理を繰り返すような バッチファイルを作成しようと思っています。 そのFOR文内でコールしたサブルーチンのERRORLEVELがうまく取得できません。ファイルコピーをしなければ値が取得できるのですが。。。 何が 原因なのか皆目見当つかずで行き詰ってしまいました。 どなたか 教えてください。 宜しく御願いします。 @echo off copy test.txt test.txt.bak for /L %%A in (0,1,5) do ( call :test echo 戻り値:%ERRORLEVEL% ) :test exit /b 99

  • DOS終了コードの確認

    有識者の方、バッチファイルの終了コードの確認方法について、ご教授願います。当方、終了コード判定のBAT作成は初めてです。 質問: TXT(a.txt)ファイル、文字列検索を行った結果、該当の文字列が見つかった場合、終了コードを"0"では無く、"1"でバッチファイルを終了する場合(EXITコマンド終了コード1)、バッチファイルの終了コード"1"が正しく出されているのか確認の仕方を教えてください。 よろしくお願い致します。 +++temp.bat+++++ Find C:\temp\a.txt "aaa" →%ERRORLEBEL%の結果 0 IF NOT ERRORLEVEL 1 (exit /B 1)

  • バッチファイルのループ処理の質問です。

    バッチファイルのループ処理の質問です。 バッチファイルでサーバにセキュリティーパッチをインストールしたいのですが、 一件しかインストール出来ません。 ---------------------------------------------- @echo on setlocal set SrcDir=\\192.168.11.5\temp\ for %%i in (%SrcDir%*.msu) do ( %%i /quiet /norestart >>Instarll_log.log IF ERRORLEVEL 3010 GOTO ReqReboot IF ERRORLEVEL 1 GOTO NG IF ERRORLEVEL 0 GOTO OK :NG echo 異常 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :OK echo 正常 > kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :ReqReboot echo 再起動が必要 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log ) goto END :END endlocal ---------------------------------------------- 続けて次のファイルをインストールするにはどうすれば良いか 教えてください。

  • バッチファイルからVBのEXEの戻り値

    いつもお世話になっています。 タイトルの通りなのですが、下記のようなバッチファイルからexeを起動し、exeがエラー終了した場合などに バッチファイルのERRORLEVELにエラーデータ(1)を入れたいのですが それを設定するのはいったいどうやったりいいのかがさっぱりでして…。f(- -; @echo off SETLOCAL call Project1.exe %ERRORLEVEL% echo %ERRORLEVEL% pause exeでのエラーが発生するタイミングなどは特に指定はないので、戻り値の設定の仕方を教えていただきたいです。 言葉足らずや説明不足など補足要求もお待ちしています。 お願いいたします。

  • bat サブルーチンのERRORLEVELについて

    バッチのサブルーチンのERRORLEVELについて質問です。 サブルーチン内でERRORLEVELを返すコマンドを実行したいのですが、 親ルーチンにそのERRORLEVELを共有したくない場合、何か方法はありますか? ============================================================ [1.bat] SET MSG1="NOTFOUND" SET MSG2="found!" echo %ERRORLEVEL% FIND %MSG1% 2.bat REM %ERRORLEVEL%は1に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% FIND %MSG2% 2.bat REM %ERRORLEVEL%は0に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% REM %ERRORLEVEL%は0であって欲しいが0に pause EXIT 1 :LOG FIND %MSG1% hogehoge.log REM %ERRORLEVEL%は1に ============================================================ [2.bat] found! ============================================================ [hogehoge.log] 空 ============================================================