Programming Field

バッチファイルについて - DOS/コマンドプロンプト コマンド一覧

バッチファイル(batch file)とはプロンプト上で入力する一連のコマンドを記述したファイルのことを指します。バッチファイルのことをバッチプログラムとも呼び、バッチファイルを利用してコマンドを次々に実行することによりアプリケーションプログラムのような動作を提供することもできます。

なお、バッチファイルの拡張子はMS-DOSから「.bat」が使われており、Windows NT系では加えて「.cmd」も使用できます。「.cmd」はコマンドスクリプト(Command Script)とも呼ばれますが、「.bat」と「.cmd」で実行できるコマンドに変わりはありません。

バッチファイルの作り方

バッチファイルは、前述の通り一連のコマンドを記述したテキストファイルとなっています。1行に1つ(以上)のコマンドを記述していくことで一連のコマンドを記述していきますが、例えば以下の内容をテキストエディターで入力してファイル「simple.bat」(末尾に「.txt」などを付けない)として保存すると、「simple.bat」はバッチファイルとなり実行することができます。

@echo off
echo バッチファイルです。
pause

「simple.bat」として保存後、プロンプト上で直接「simple.bat」と入力してエンター(実行)するか、エクスプローラー上などで「simple.bat」をダブルクリックして実行すると、

バッチファイルです。
続行するには何かキーを押してください . . .

という表示が行われて入力待ち状態になります。これは、

  1. @echo off」によってエコーバック(「C:\>」などの表示)をオフにする(※ 「@」はコマンドの前につけるとそのコマンドのエコーバックを抑制します。ここでは「@」がないと「echo off」というコマンドが画面上に見えてしまいます。)
  2. echo バッチファイルです。」によって画面に「バッチファイルです。」を出力する
  3. pause」によってシステムが持つメッセージ「続行するには何かキーを押してください . . .」を出力して入力待ち状態にする

という処理を自動的に(順番に)実行した結果となります。なお、Pauseによる入力待ちで何かキーを入力すると次に進みますが、「simple.bat」はこれ以上コマンドが記述されていないため、そこで実行終了となります。

※ 一連のコマンドをまとめて実行するような処理を一般的に「バッチ処理」と呼びます(「バッチファイル」は「バッチ処理を行うファイル」という意味です)。

バッチファイルの目的

バッチファイルは多くの場合「処理を楽したい」というときに用いられます。例えば「あるファイルXに対してCmdAを実行し、その結果生成された特定のファイルに対してCmdBを実行する」という処理を何度も行うことがある場合、以下のようにバッチファイルとしてその一連の処理を書いておけば、バッチファイルを実行するだけでその処理を実行することができます。

@echo off
set TEMP_X=%1
set TEMP_Y=output.tmp
CmdA %TEMP_X% %TEMP_Y%
if exist %TEMP_Y% CmdB %TEMP_Y%
if exist %TEMP_Y% del %TEMP_Y%
set TEMP_X=
set TEMP_Y=

※ コマンドプロンプト用のバッチファイルとして記述する場合、ファイル名はスペース文字が入ることを考慮して「" "」で括って扱うことを推奨します。例えば以下のように書き換えます(完全な書き換えではありません)。

@echo off
set "TEMP_X=%~f1"
set "TEMP_Y=%~dp1output.tmp"
CmdA "%TEMP_X%" "%TEMP_Y%"
if exist "%TEMP_Y%" CmdB "%TEMP_Y%"
if exist "%TEMP_Y%" del "%TEMP_Y%"
set TEMP_X=
set TEMP_Y=

複数のコマンドを扱う際、「特定の条件にあてはまる場合にのみプログラムやコマンドを実行したい」という場合もありますが、上記の例にもあるようにIfコマンドなどを用いることで、そのような処理も自動的に制御することができます。

バッチファイルの便利な使い方

他のバッチファイルを呼び出す

Callコマンドを用いることでバッチファイル内から別のバッチファイルを実行することができます。これにより、バッチファイルが複数存在する状況で共通の処理を1つのバッチファイルにまとめ、個々のバッチファイルのサイズを軽減させたり、バッチファイルをメンテナンスしやすくしたりすることができます。

注意点として、Callコマンドを用いずにバッチファイルを実行すると、元のバッチファイルはそこで処理が終了するという仕様があります。バッチファイルからバッチファイルを実行する場合は、特別な場合を除いてCallを付けることを意識する必要があります。

ドラッグ&ドロップで呼び出す

Windowsにおいてバッチファイルを作成すると、エクスプローラー上では他のアプリケーション(実行可能ファイル)と同様に、任意のファイルをドラッグしてバッチファイルにドロップすることができます。

この場合、バッチファイルはドロップされたファイルのフルパス(絶対パス)が引数として指定された状態で実行されるため、バッチファイルを引数付きで実行するためにコマンドプロンプトからファイル名を手入力する必要がなくなります。

さらに、バッチファイルに対してショートカットを作成し、そのショートカットの「リンク先」にバッチファイルで解析される引数をあらかじめ付加しておくと、そのショートカットにファイルをドロップすれば「あらかじめ付加した引数」と「ドロップしたファイルのパス」を結合した引数でバッチファイルが実行されます。

環境変数をセットする

環境変数はプログラムやバッチファイルから使用できる「設定」情報の一種です。あるプログラムが特定の環境変数を参照する際、その環境変数の内容を状況によって変える必要があるときにバッチファイルが利用できます。

具体的には、バッチファイルで一通り環境変数を設定する処理(Setコマンド)を記述し、そのあとにプログラムを実行する処理を記述すれば、バッチファイル内で設定した環境変数の内容がプログラムに反映されます。ここで設定した内容はシステム設定の内容を上書きするため、普段は直接プログラムを実行してシステム設定を利用し、特定の条件を使う場合はバッチファイル経由でプログラムを実行して挙動を変える、といった使い方ができます。

バッチファイルで主に使われるコマンド・文字一覧

以下のコマンドや文字がバッチファイルの制御を行うなどの目的でよく用いられます(アルファベット順)。

Callバッチファイル内からバッチファイルを終了することなく呼び出します。またはサブルーチンを実行します。
Choice画面上に選択肢を表示し、入力を促します。
Cls画面出力を消去します。
Colorプロンプトの色を変更します。
Echo画面に文字を出力します。またはプロンプトの表示・非表示を切り替えます。
Endlocal環境のローカル化を終了します。
Exitプロンプトを終了します。
For指定パターンに一致するファイルまたはテキストに対してコマンドを実行します。
Gotoバッチファイルで指定したラベルの位置に制御を移します。
If指定した条件に一致する場合にコマンドを実行します。
Pathプログラムの検索パスを表示・設定します。
Pause処理を停止(ポーズ)し、プロンプト上で何らかのキー入力を促します。
Popd直前に行われたPushdのディレクトリ移動を戻します。
Promptプロンプトの表示を設定します。
Pushd現在のディレクトリを記憶しつつ別ディレクトリに移動します。
Rem何も処理を行いません。バッチファイル内での注釈の記述に利用します。
Set環境変数を表示・変更します。
Setlocal環境のローカル化を行い、環境変数などの変更が一時的なものになるようにします。
Startプログラムの起動、またはファイルの既定処理を実行します。
Titleプロンプトウィンドウのタイトルを変更します。
|[パイプ] 左コマンドの出力を右コマンドの入力にします。
<[入力リダイレクト] 指定ファイルの内容をコマンドの入力にします。
>[出力リダイレクト] コマンドの出力を指定ファイルに書き込みます。
>>[出力リダイレクト] コマンドの出力を指定ファイルに追加します。
@バッチファイルでコマンドのエコーバックを抑制します。
:バッチファイルでラベルを宣言します。
%環境変数の値やバッチファイル引数の値の取得に利用します。
!環境変数の遅延展開時に利用します。
^直後の特殊文字を通常文字として扱います。または複数の行を単一の行として扱うようにします。
&2つのコマンドを連続して実行します。
||コマンドの実行に失敗した場合に実行するコマンドを指定する際に利用します。
&&コマンドの実行に成功した場合に実行するコマンドを指定する際に利用します。
( )複数のコマンドをグループ化して単一コマンドのように扱います。

バッチファイルのその他の特徴

  • バッチファイル(コマンドスクリプト)は、システム(OS)によって「実行可能ファイル」の1つとして扱われます。そのため、プロンプト上でファイル名を入力するだけで直接実行することができます。さらに、プロンプト外のアプリケーション/プログラムからもバッチファイルを直接実行することが可能です(例としてWin32APIの CreateProcess 関数に指定するプログラムにバッチファイルを指定することができます)。
  • バッチファイルの中身は各行にコマンドが記述されたテキストデータとなります。そのため、メモ帳などの標準的なテキストエディターでバッチファイルを作成・編集することができます。
    • テキストエディターにてファイル保存時に拡張子を明示的に「.bat」または「.cmd」(Windows NT系/XP以降)とすることでバッチファイルが作成されます。
  • バッチファイルは原則としてプロンプト画面上(厳密にはコンソールまたはそれに準ずる入出力のある環境下)で実行されます。WindowsのGUIアプリケーションなど元々プロンプト画面を持たないアプリケーションから実行された場合は、特別な指定・処理がない限り新しいプロンプト画面が表示されてその画面上でバッチファイルが実行されます。
  • バッチファイルはあくまで一連のコマンドを実行するためのファイルです。そのため、コマンドやプログラム実行だけでは表現できないような処理(ファイル内の特定のオフセットからデータを読み取る、複雑なテキストデータ処理を行う、など)には向いていません。
    • そのような処理を行う場合はPowerShellや各種スクリプト言語(Windows Script経由でのJScript(JavaScript)やVBScript、Node.jsを使ったJavaScript、RubyやPythonなどのWindows対応されたもの)を利用する、あるいはC言語や.NETを利用できる言語などを利用したクライアントプログラムを開発することが望まれます。