バッチ処理とはどんな意味?メリットやファイルの作り方を紹介

バッチ処理は計算機科学の現場で古くから行われてきました。現代ではビッグデータの自動処理や限られたリソースの効率的な運用方法として広く用いられています。本記事ではバッチの基礎知識から簡単なバッチファイルの作成までまとめています。

新たな環境で経験を生かしたいエンジニアの方!

DMM.comやRakSulなどの企業からの相談を待つだけ!
Offersで活躍の場を広げてみませんか?

副業を開始する

バッチ処理の基礎知識

データを扱っていると同じ種類のファイルや同じような数値を『繰り返し機械的に処理』することが増えます。

『限られたリソース』をもっと『効率的』に使い『処理を自動化』できないかと考えたことはないでしょうか。

このとき『バッチ処理』がひとつの『ソリューション』になるかもしれません。

 バッチとは

『バッチ(batch)』は『複数の似ているもの』をまとめて『一つのユニットとして扱う』ことや、『一つのグループとして生産・処理』することを差す語です。

英語圏では古くから『書類の束』や『パン1釜分』などがバッチと呼ばれ、物流業や製造業など『計算機科学』とは関わりのない分野で広く使われてきた言葉です。

本記事では、企業が運用する大規模なコンピュータ群である『メインフレーム(サーバーシステム)』や、個人で使うPCにおいてのバッチを取り扱います。

複数のプログラムやファイル転送コマンドなどの『バッチ』を、あらかじめ実行する順序を決めておいて自動処理させることを『バッチ処理』といいます。

ユーザーが逐次プログラムに手入力していくのではなく、処理内容のセットであるバッチを『トリガー(きっかけ)』で実行させる方法を指します。

 バッチ処理の使われ方

例えば店舗販売の『売り上げデータ』や銀行の『入出金データ』など、企業活動のなかでは日々大量のデータが蓄積されていきます。

こういったデータはただ保存されるだけでなく『集計・整理』され『正しいフォーマットで一括管理』される必要があります。

店舗で『手入力』されたデータをオフィスで『更に手入力』となっているなら効率化を考えた方が良さそうです。

ここでバッチ処理を行えば、売り上げデータを『自動で部門別に抽出』して『別々のファイルに一元管理』させることができます。更に売り上げデータから『在庫状況を拾い出し』して実際の『在庫との整合性』を見たり、必要な『発注品目のリストアップ』まで自動化することも考えられるでしょう。

こういった処理はメインフレームのCPUやメモリあるいは通信帯域といった『リソースを圧迫』しますので、業務時間内に実行させるのには向きません。そこでバッチ処理を夜間に行う『夜間バッチ』が一般的になっています。

 バッチ処理の対義語

バッチ処理は『一連のプログラム群(ジョブ)』を、あらかじめ決めた処理内容で自動実行します。

対義語と考えられている語は複数あって、まずは『対話型処理』あるいは『インタラクティブ処理』です。プログラムを使用する際にはディスプレイに表示される『ユーザインターフェース』上で処理内容を入力して応答を逐次確認するのが一般的です。

もう一つの対義語は『リアルタイム処理』です。『リアルタイムシステム』『実時間処理』『RT』とも書きます。

入力に対し『即時応答』することを目的とし『ATM・ネットバンキング・カード決済・航空券の予約』など即時性が求められる業務で用いられます。

リアルタイム処理にはWindowsのような『汎用OS』は不向きであるため『リアルタイムOS(RTOS)』が特化型として設計されています。

バッチ処理のメリットとデメリット

便利なバッチ処理ですがメリット・デメリットを理解しておくことは重要です。

 バッチ処理のメリット

まず大きなメリットは『手入力の労力・時間が大幅削減できる』ことです。

バッチ処理を実行させるトリガーとなるのは『時間』あるいは『データ量』です。

『時間』は『スケジューリング』といって「○時にジョブ開始」という設定を行なっておき、この時間になれば自動的にバッチ処理を実行します。

比較的データ量が少なかったり業務時間が固定されているような事業の場合には、夜間バッチなどで『空き時間のリソース』を活用して自動実行させられるのはメリットと言えます。

もうひとつのトリガーは『データ量』で、これは「蓄積されたデータが○○以上になったらジョブ開始」というもので、あらかじめ境目となる値となる『閾値(いきち・しきいち)』を決めておきます。

閾値を越えなければジョブスタートとならないため、売り上げから見た店舗の発注品目リストアップなど『適切なタイミング』で実行させられることもメリットといえるでしょう。

 バッチ処理のデメリット

バッチ処理で起こりやすい問題が『突き抜け』です。これは『予定時間内にバッチ処理が終了しなかった』ことを指します。

突き抜けは事業規模の大きい企業に起こりがちで、原因として考えられるのは『処理データ量が予想を上回っていた』ことです。

銀行業など『オンライン処理』が多い業態では全てを即時処理するとメインフレームがパンクしかねないため、『システムダウン』を避けるために給与振り込みなど即時性のない処理はバッチ処理に回しています。

ここで処理の終了時間を見誤ると始業時間に差し掛かってしまい『日中の業務システムがスタートできない』ということになってしまう場合があります。

対策としては『ジョブの並列処理(並行計算)』を行うことや必要に応じて『クラウドサーバー』を利用することです。

『負荷の分散』を行い『処理時間を短縮』することが重要といえるでしょう。

バッチファイルの基礎知識

汎用OSの代表格であるWindowsでのバッチ処理を見てみましょう。

バッチ処理をWindowsで簡単に行うときには『バッチファイル』を使うことになります。

『コマンドプロンプト(cmd.exe)』で記述する『コマンド(システムへの指示)』や『パス名(ファイルやディレクトリの所在を表す文字列)』を毎回手入力するのではなく、ひとまとまりの処理として記述して『バッチとして保存』したものをバッチファイルと呼びます。

バッチファイルの『拡張子』は『.bat』か『.cmd』であり、テキストファイル(拡張子は『.txt』)で記述されたバッチ処理のプログラムの『文字コード』を『ANSI』あるいは『Shift-JIS』形式にして保存します。

 コマンドの概要

バッチファイルではシステムに実行させたいコマンドは基本的に『1行ずつ記述』します。

代表的なコマンドをいくつか見てみましょう。

まずはバッチファイルの先頭に書かれることが多い『@echo off』です。コマンドプロンプトでは実行中のコマンド内容が随時画面に表示される仕様になっています。

これは挙動をチェックする際に有用ですが『実行中の文字列を表示させない』場合には「@echo off」を記述しておきます。

またバッチファイル内ではファイル名やコマンド名などの『環境変数』を記述することになります。

環境変数を作成したり書き換える処理を行うとき『setlocal』コマンドを先に記述しておくと、バッチ処理後には『処理前の値に戻す』ことができます。元の値に戻さない場合には記述しないようにしましょう。

バッチファイル内の説明などのコメントは『rem』コマンドを記述した行に書きます。これでその行は『実行されない文字列』になります。コメントが複数行に渡る場合は「rem~」という行を並べる形になります。

これらを書いた後に実際のプログラム内容を記述し「.bat」や「.cmd」形式で保存します。

 バッチファイルの実行方法

作成したバッチファイルを実行するには、保存されたファイルが置かれている『ディレクトリ(フォルダ)』を表示し、ファイル名を入力するだけで実行できます。

ファイル名が例えば「test.bat」であれば「test」あるいは「test.bat」と入力します。

このファイルが「Cドライブ」内の「batch」フォルダに保存されているとしたら「c:\batch\test」という形で『フルパス(絶対パス)』を入力することでも実行できます。

またバッチファイルをダブルクリックする方法や『ファイル名を指定して実行』からパス名を入力する方法もあります。

 パスを通すと便利

作成したバッチファイルが『カレントフォルダ(表示中のフォルダ)』にない場合はフルパスを入力する手間がかかりますので、入力を簡単にするためにフォルダ名を『Path環境変数』に登録しておきます。これを『パスを通す』といいます。

設定方法はまず『システムのプロパティ』内の『詳細設定』タブを開きます。次に『環境変数』を開き「変数」に「Path」と表示されている変数がPath環境変数です。ここで『編集』をクリックし変数の末尾に「c:\batch」を追加します。

パスを複数通したいときは、末尾の文字列を『セミコロン(;)」で区切って「c:\batch;c:\command;c:\job」のように記述します。

こうすることでフルパスを入力する必要なくファイル名を入力するだけでバッチ処理が実行できます。

基礎練習としてのバッチファイルの作り方

では実際にプログラムを記述する練習をしてみましょう。

 ポーズや日付の表示

バッチファイルの処理を中断させたいときは『pause』を記述します。この場合プログラムがpause行まで実行されると「続行するには何かキーを押してください」と表示されます。

『pause >nul』と記述すると、ダイアログは表示されず単に処理がポーズされます。

現在の日付を『表示』させたいときは『set』と『echo』コマンドを使います。1行目に『set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%』2行目に『echo %yyyymmdd%』と記述すれば日付が8桁(年月日のyyyymmdd)で表示されます。

 フォルダ作成

『フォルダ作成』には『mkdir』か『md』コマンドを用います。

例えば『md バッチファイル』と記述するとカレントフォルダに「バッチファイル」という名前のフォルダが作成できます。

 txtファイル作成

空のテキストファイルを作成したい場合は『type』コマンドを用います。

『C:\batch> type nul > サンプル.txt』と記述すると「batchフォルダ」内に「サンプル」という名前で何も書かれていないテキストファイルが作成されます。

また内容の書かれたテキストファイルを作成するには『echo バッチファイル>サンプル.txt』と記述し、次の行に『echo テスト>>サンプル.txt』と記述すれば1行目に「バッチファイル」2行目に「テスト」と書かれた「サンプル」テキストファイルの出来上がりです。

 利用できる環境変数

バッチファイルでは『バッチパラメータ』と呼ばれる変数を利用することができます。

渡された引数は『%1~%9までの引数』として第1引数から第9引数まで取得できます。

バッチファイルを実行するとき最初に付加されるパラメータは『%1(第1引数)』です。ここに値を返す構文をいくつか例示します。

%~1 全ての引用句(")を削除して%1を取得します。
%~f1 %1に完全修飾パス名を取得します。
%~d1 %1にドライブ名を取得します。
%~p1 %1にパスを取得します。
%~n1 %1にファイル名を取得します。
%~x1 %1にファイル拡張子を取得します。

また『プログラム実行時に計算した値』を取得するものもありますので、代表的な環境変数を挙げます。

%CD% カレントディレクトリ文字列を取得します。
%DATE% 現在の日付を取得します。
%TIME% 現在の時刻を取得します。

引数の利用やGUIプログラム起動

他にも様々な構文がありますので使用例を見てみましょう。

 引数を利用するバッチ

コマンドプロンプトからバッチを実行するとき、引数を渡したいなら「cmd.exe」を起動させて『バッチファイル名+半角スペース+第1引数+半角スペース+第2引数…』と記述して実行します。

例えば「test.bat 月曜 火曜 水曜」と書けば「test.bat」ファイルに月~水曜の3つの引数を引き渡すことができます。

またバッチファイルに渡された引数全てをまとめて扱うには『%*』と記述します。

 GUIプログラムの起動

バッチファイルでは『キャラクタ(文字・数字・符号)』のみを記述・表示する『CUI(キャラクタユーザインターフェース)』のコマンドを利用することが多いと思いますが『GUI(グラフィカルユーザインターフェース)』プログラムを呼び出して起動させることもできます。

これはシンプルにプログラムの『実行ファイル(.exe)』の絶対パス名を記述します。例えばWord2019なら『"C:\Program Files (x86)\Microsoft Office\root\Office19\WINWORD.EXE" %*』とします。末尾に「%*」を書き加えることで起動プログラムに引数を渡せます。

 startコマンドで起動

また『start』コマンドを利用し『start "C:\Program Files (x86)\Microsoft  Office\root\Office19\WINWORD.EXE" %*』と記述すれば、バッチファイルのウィンドウを表示させずに目的のGUIプログラムだけを表示させることができます。

if文でできること

『if文』を使うと指定した条件に合格する場合・しない場合の振る舞いを記述できます。

 文字列のチェック

例えば『if "%1"=="チェック" echo 合格』と記述するとif構文は「第1引数」と「チェック」の文字列が一致したとき「合格」と表示します。

また『if not "…』と書けば文字列が一致しない場合の振る舞いを記述できます。

 ファイルやフォルダの確認

ファイルやフォルダが『存在するかチェック』する場合、例えば『if exist "C:\batch\test.bat" echo 合格』と記述すると「test.bat」ファイルが存在した場合は「合格」と表示します。

 数値比較やエラー検出

『数値比較』を行う場合は文字列チェックの「==」を『EQU(等しい)』『NEQ(等しくない)』『GTR(より大きい・>)』『LSS(より小さい・<)』『GEQ(以上)』『LEQ(以下)』という『比較演算子』に置き換えます。

例えば『if "%1"GTR"314" echo 合格』と記述すると第1引数が314より大きいなら「合格」と表示します。

またコマンドを実行してエラーがあった場合は『エラーレベル』が1以上の値を返してきます。ここで『errorlevel』コマンドを使って『if errorlevel 1 echo 不合格』と記述すると、エラーがあった場合は「不合格」と表示されることになります。

その他の制御構文

他にも使えると便利な構文がありますので概要を見てみましょう。

 goto

『goto』コマンドを使うと指定した『ラベル』にジャンプしてプログラムを実行できるため、より複雑なプログラムが書けます。

例えば『goto :チェック2』と書くと『:チェック2』とだけ書いてあるラベル(行)にジャンプします。その後の行に『goto :チェック1』と書けば「:チェック2」より上の行にある『:チェック1』に戻るジャンプもできます。

この場合『goto :eof』と書いてある行が実行されるとバッチファイルが終了します。

 call

バッチファイルAを実行中に『バッチファイルB』と記述してバッチファイルBを呼び出して実行させると、Aの処理を中断してBの処理を終了させても、Aの『中断した処理には戻ってこない』という問題があります。

ここで『call』コマンドを使い『call バッチファイルB』と記述します。するとBを終了させた後に「call」したところまで戻って処理を続けAを終了させることができます。

 for

『for』コマンドは『繰り返し処理』を行わせるもので、例えば1から100の指定されたステップを1から順に1つずつ処理できます。

例文を挙げると『for %%i in (*.*) do echo %%i』と書けば『ファイル名の一覧』が表示されます。

まとめ

以上がバッチ処理の概説でした。バッチ処理は多くの処理を自動化できるため、正しく命令を与えれば『作業効率を大幅にアップ』させることができます。

ただ自動で大きなデータ処理を行わせるからこそ『プログラムの誤り』がないか『メインフレームのキャパシティ』を超えていないかといったことを十分にチェックして運用する必要があるといえるでしょう。

はじめから複雑な処理のバッチファイルを書こうとすると『エラーの原因がわからない』ことになりかねませんので『構文の理解』から少しずつ慣れていくことをおすすめします。

本記事が基礎情報として役立てたなら幸いです。

この記事をシェア

副業・フリーランス

プログラミング

デザイン

インタビュー

スマホで精子のセルフチェック、男性の妊活市場に一人で挑んだ入澤諒

「仕事って辛いよな」と思う瞬間ありませんか? でも、その辛さを感じると同時に仕事に熱中している自分に気づく瞬間があるのも事実。そこで、この連載「一人はつらいよ」では、「辛い辛い」と言いなが...

1ヶ月でエンジニア採用に成功。Offersは採用に必要な「3つの力」を増幅してくれました。

日本でトップクラスのシェアを誇るMAツール「List Finder」をはじめ、オンラインセミナーやメディアを手がけるなど、開発力が大きな武器である株式会社イノベーション。 順風に事業展開を進め...

ハイクラスのエンジニアを3名採用! 新規開発が一気に進みました。

WEB面接/動画面接で採用力を強化する「HARUTAKA」、候補者と面接官の面接体験を改善する「ZIGAN」をリリースしている株式会社ZENKIGEN。2017年に創業した同社は今、リリースした...

スカウト返信率は30%超!優秀なエンジニアに気軽にリーチできる仕組みに驚きました。

優秀なエンジニアの獲得競争は激化し、採用できるかどうかは企業の死活問題。エンジニア自体の不足や技術やスキルの見極めの難しさ、カルチャーフィットなどから、採用の難易度は年々高まっています。 広告...

お金

グルメ