【バッチスクリプト】複数のバッチスクリプトを連続実行(逐次実行)する処理【CALLコマンド】


いつもお世話になっております。
RfromLです。

今回は複数のバッチスクリプトを順次連続実行するバッチスクリプトについてです。

1.はじめに

例として、異なる処理を行うバッチスクリプトが3つあったとします。

 ・バッチ①.bat
 ・バッチ②.bat
 ・バッチ③.bat

実行するバッチスクリプトの数が上記のように3つぐらいなら一個一個手作業で実行でもそこまで手間でもないですが10個も20個もあると、一個一個手作業で実行するのは面倒です。

また、以下の図のように実行する順番が決まっている場合は、毎回手作業で実行となると実行する順番を間違えるリスクもあります。

バッチスクリプトからバッチスクリプト実行に使用するコマンドは「CALL」コマンドです。

 [コード]
 CALL バッチ①.bat
 CALL バッチ②.bat
 CALL バッチ②.bat

CALLコマンドでバッチスクリプトを実行すると、呼び元のバッチスクリプトは実行先のバッチスクリプトが終了してから次のコマンドへ進むようになっているので、バッチ①.bat~バッチ③.batが同時に実行されることはありません。

今回は実例として、以前投稿した記事で作成した「テーブルエクスポート処理」「テーブルトランケート処理」「テーブルインポート処理」を逐次実行するバッチスクリプトを作成します。

CALL先のバッチスクリプトのそれぞれ詳細はそれぞれ以下の記事で紹介しています。
【バッチスクリプト/SQL Server】テーブルエクスポ-ト処理バッチ
【バッチスクリプト/SQL Server】テーブルトランケート処理バッチ
【バッチスクリプト/SQL Server】テーブルインポート処理バッチ

イメージとしては以下の処理を行うバッチスクリプトとなります。

同じテーブル「価格情報テーブル」に対し、エクスポート、トランケート、インポートを行うので、正しく処理されるには順番通りにバッチスクリプトが実行され、且つそれぞれ前の処理が終了してから後続の処理が実行される必要があります。


2.環境情報

今回の手順作成実施で使用した環境は以下のバージョンとなっています。

OSWindows11 Home 64ビット
DBMSSQL Server 2019
統合環境SQL Server Management Studio v18.10
BCP15.0.2000.5

3.使用コマンド

今回使うCALLコマンドのヘルプを見てみます。

以下、CALLコマンドのヘルプ(コマンド「CALL /?」の実行結果)より

バッチ プログラムを別のバッチ プログラムから呼び出します。

CALL [ドライブ:][パス]ファイル名 [バッチパラメーター]

  バッチパラメーター   バッチ プログラムで必要なコマンド ライン情報を指定します。

コマンド拡張機能を有効にすると、CALL は次のように変更されます:

CALL コマンドは、CALL のターゲットとしてラベルを受け付けるようになります。
構文は、次のとおりです:

    CALL :ラベル 引数

指定された引数で新しいバッチ ファイル コンテキストが作成され、指定
されたラベルの次の文に制御が渡されます。バッチ スクリプト ファイルの
最後に 2 回到達することによって、2 回 "終了" する必要があります。
1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。
2 回目に、バッチ スクリプトが終了します。バッチ スクリプトから "戻る"
ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。

また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように
変更されました:


    %* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
        %5 など) を参照します。

    バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
    を使うことができます:

        %~1         - すべての引用句 (") を削除して、%1 を展開します。
        %~f1        - %1 を完全修飾パス名に展開します。
        %~d1        - %1 をドライブ文字だけに展開します。
        %~p1        - %1 をパスだけに展開します。
        %~n1        - %1 をファイル名だけに展開します。
        %~x1        - %1 をファイル拡張子だけに展開します。
        %~s1        - 展開されたパスは、短い名前だけを含みます。
        %~a1        - %1 をファイル属性に展開します。
        %~t1        - %1 をファイルの日付/時刻に展開します。
        %~z1        - %1 をファイルのサイズに展開します。
        %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                       最初に見つかった完全修飾名に %1 を展開します。
                       環境変数名が定義されていない場合、または
                       検索してもファイルが見つからなかった場合は、
                       この修飾子を指定すると空の文字列に展開されます。

    修飾子を組み合わせて、複合結果を得ることもできます:

        %~dp1       - %1 をドライブ文字とパスだけに展開します。
        %~nx1       - %1 をファイル名と拡張子だけに展開します。
        %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                       検索して %1 を探し、最初に見つかったファイル
                       のドライブ文字とパスだけに展開します。
        %~ftza1     - %1 を DIR の出力行のように展開します。

    上の例の %1 と PATH は、他の有効な値で置き換えることができ
    ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
    は %* と同時には使用できません。

ヘルプを見る限り、特にオプションは無いのでそのままcallのパラメータに実行するバッチスクリプトを指定するだけです。

[ コマンド例 ]

CALL [スクリプトのパス]実行するバッチスクリプト①.bat
CALL [スクリプトのパス]実行するバッチスクリプト②.bat
CALL [スクリプトのパス]実行するバッチスクリプト③.bat

4.作成スクリプト

4-1.コード内容

今回作成したスクリプトファイルのコード内容は以下の通りです。


[ SequentialRun.bat ]

@ECHO OFF
@REM ------------------------------------------------------------
@REM 初期処理
@REM ------------------------------------------------------------
@REM 実行バッチファイルディレクトリ設定
SET CMD_PATH=%~dp0

@REM ------------------------------------------------------------
@REM 処理開始メッセージ
@REM ------------------------------------------------------------
ECHO %DATE:~0,4%年%DATE:~5,2%月%DATE:~8,2%日 %TIME:~0,2%時%TIME:~3,2%分%TIME:~6,2%秒 処理開始

@REM ------------------------------------------------------------
@REM 価格情報テーブル全件洗い替え処理
@REM ------------------------------------------------------------

SET SYORI_NAME="価格情報テーブル アンロード処理"
CALL %CMD_PATH%\価格情報_UNLOAD.bat
IF NOT %ERRORLEVEL% == 0            GOTO ABEND

SET SYORI_NAME="価格情報テーブルアン トランケート処理"
CALL %CMD_PATH%\価格情報_TRUNCATE.bat
IF NOT %ERRORLEVEL% == 0            GOTO ABEND

SET SYORI_NAME="価格情報テーブルロード処理"
CALL %CMD_PATH%\価格情報_LOAD
IF NOT %ERRORLEVEL% == 0            GOTO ABEND

@REM ------------------------------------------------------------
@REM 正常終了処理
@REM ------------------------------------------------------------
:END
ECHO %DATE:~0,4%年%DATE:~5,2%月%DATE:~8,2%日 %TIME:~0,2%時%TIME:~3,2%分%TIME:~6,2%秒 正常終了
ECHO.

EXIT /B

@REM ------------------------------------------------------------
@REM 異常終了処理
@REM ------------------------------------------------------------
:ABEND
ECHO エラー発生処理名:%SYORI_NAME%
ECHO %DATE:~0,4%年%DATE:~5,2%月%DATE:~8,2%日 %TIME:~0,2%時%TIME:~3,2%分%TIME:~6,2%秒 異常終了
ECHO.

EXIT /B

4-2.ディレクトリ構成

作成したバッチスクリプトを実行する際のディレクトリ・ファイル構成です。
今回実行するバッチスクリプトは「SequentialRun.bat」です。

「SequentialRun.bat」の中から「価格情報_UNLOAD.bat」「価格情報_TRUNCATE.bat」「価格情報_LOAD.bat」が実行されます。

4-3.価格情報テーブル

CALL先のバッチスクリプトが使用するテーブルの情報です。

■テーブルレイアウト

No項目名NULLKEY
1銘柄コードchar4NG1
2価格numeric9NG
3利回りnumeric5NG
4NAVnumeric9NG
5NAV倍率numeric5NG
6時価総額numeric9NG
7出来高numeric9NG
8基準年月日char8NG2

■テーブルデータ

銘柄コード価格利回り1口NAVNAV倍率時価総額出来高基準年月日
8991992005.401232680.8046336188520250327
89921545003.421288711.2010531041720250327
99971180005.551234950.9641532105120250327
99981167005.611234950.9441075158520250327
9999993005.401232680.8146383334420250327

4-4.価格情報テーブルインポートファイル

テストに使用するインポートファイルのデータ内容です。

■価格情報テーブルデータファイル

銘柄コード価格利回り1口NAVNAV倍率時価総額出来高基準年月日
99971180005.551234950.9641532105120250328
99981167005.611234950.9441075158520250328
9999993005.401232680.8146383334420250328

区切り文字:,(カンマ)
改行コード:CRLF
文字コード:S-JIS

4-5.機能説明

①開始処理
・処理開始メッセージを以下の書式で標準出力に出力する。
  「スクリプトID YYYY年MM月DD日 hh時mm分ss秒 処理開始」

②価格情報テーブル アンロード処理
・バッチスクリプト「価格情報_UNLOAD.bat」(価格情報テーブル アンロード処理)を実行する。
・ERRORLEVELを判定処理
 ステータスが0の場合、正常終了処理を行う。
 ステータスが0以外の場合、異常終了処理を行う。

③価格情報テーブル トランケート処理
・バッチスクリプト「価格情報_TRUNCATE.bat」(価格情報テーブル トランケート処理)を実行する。
・ERRORLEVELを判定処理
 ステータスが0の場合、正常終了処理を行う。
 ステータスが0以外の場合、異常終了処理を行う。

④価格情報テーブル ロード処理
・バッチスクリプト「価格情報_LOAD.bat」(価格情報テーブル ロード処理)を実行する。
・ERRORLEVELを判定処理
 ステータスが0の場合、正常終了処理を行う。
 ステータスが0以外の場合、異常終了処理を行う。

⑤正常終了処理
・正常終了メッセージを以下の書式で標準出力し処理を終了する。
  「スクリプトID YYYY年MM月DD日 hh時mm分ss秒 正常終了」

⑥異常終了処理
・異常終了メッセージを以下の書式で標準出力し処理を終了する。
  「スクリプトID YYYY年MM月DD日 hh時mm分ss秒 異常終了」


5.実行結果確認

実行結果確認は稼働確認として正常処理、異常処理の以下2パターンを行います。

 ①正常終了確認(入力ファイル有件、テーブルデータ有件)
 ②異常終了確認(入力ファイル非存在)

5-1.正常終了確認(入力ファイル有件、テーブルデータ有件)

①テーブルにデータが登録されていることを確認

②インポートするデータファイルが有件であることを確認

③バッチスクリプト「SequentialRun.bat」を実行

④ログファイルを確認し、処理が正常終了していることを確認

ログファイルが作成されていることを確認

それぞれのログファイルの内容を確認し、正常に処理されていることを確認します。

「価格情報_UNLOAD.bat」の処理が実行され正常終了していることを確認

「価格情報_TRUNCATE.bat」の処理が実行され正常終了していることを確認

「価格情報_LOAD.bat」の処理が実行され正常終了していることを確認

⑤エクスポートファイルを確認し、テーブルに登録されていたデータが出力されていることを確認

⑥インポート対象のテーブルが3件に変わっていることを確認

5-2.異常終了確認(入力ファイル非存在)

①インポートするファイルが存在しないことを確認

②インポート対象テーブル「価格情報」テーブルにデータが存在することを確認

③バッチスクリプト「SequentialRun.bat」を実行

④ログファイルを確認し、「価格情報_LOAD.bat」のみ処理が異常終了していることを確認

「価格情報_UNLOAD.bat」の処理が実行され正常終了していることを確認

「価格情報_TRUNCATE.bat」の処理が実行され正常終了していることを確認

「価格情報_UNLOAD.bat」の処理が実行され正常終了していることを確認

⑤インポート対象のテーブルがトランケートまで行われ0件になっていることを確認


6.おわりに

注意点として今回は別バッチスクリプトを実行するコマンドとして「CALL」コマンドを使用していますが、実行先のバッチスクリプトの「EXIT」部分にオプション「/B」が指定されて「EXIT /B」となっている必要があります。

オプション「/B」が指定されていない場合、呼び出し元のバッチスクリプトも終了されてしまい後続の処理が実行されなくなります。

もし、実行先のバッチスクリプトがオプション「/B」の指定が無い「EXIT」だった場合は「START」コマンドを使用します。

以上です。
宜しくお願い致します。


タイトルとURLをコピーしました