対象OS:Windows 7/Windows 8/Windows 8.1/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2
「バッチ」(バッチコマンドともいう)とは、複数のコマンド列をあらかじめ「バッチファイル」と呼ばれるテキストファイルに記述しておいて、それらを順番に、自動的に実行させる機能のことである。ファイルのコピーやバックアップ、システムの設定変更、ツールの起動など、コマンドプロンプト上でいつも決まった処理をすることが多い場合、それらの処理をバッチファイル化しておけば、すぐに実行できるようになる。またタスクに登録することにより、毎日とか毎週など、ある決まった時間に起動して処理することも可能になる。
Windows OSで自動実行できるスクリプトとしては、バッチ以外にもWSHやPowerShellなども利用できる。だが、バッチは非常に古くから提供されているため(Windowsの前身のMS-DOS時代から利用できる機能である)、どのWindows上でも(ほとんど同じように)利用できるという利点がある。基本的には、単にコマンド列を列挙しておくぐらいの機能しか持っていないため、バッチファイルを作成するのはそう難しいものではない。
とはいえ、歴史的な経緯からバッチファイルには固有の(クセがあるといってもいい)機能や制限などがいくつかあるので、本TIPSでは基本的なバッチファイルの作成/利用方法についてまとめておく。対象はWindows 7/Windows Server 2008 R2以降とする。とはいえバッチの仕様はWindows NTからWindows 2000になる時にいくらか機能が強化されたぐらいで、それ以降はあまり大きな変化はない。
■記事内目次
Windows OSのバッチファイルは単なるテキストファイルである。なのでメモ帳などを使って実行したいコマンド列を列挙し、文字コードを「ANSI」あるいは「Shift-JIS」形式にして保存する(UnicodeやUTF-8にしてはいけない)。ファイルの拡張子は「.BAT」か「.CMD」のいずれかにしておく(どちらでも特に違いはないが、今なら.CMDの方がよいだろう)。
バッチファイルの各行には、実行したいコマンドを(基本的には)1行ずつ記述する。例えば、コマンドプロンプトの文字コード(表示モード)を切り替える「chcp.exe」というコマンドがあるが、これをバッチファイルで使う場合は次のようにする(chcpについては関連記事参照)。us.cmdとjp.cmdという2つのコマンドの例である。
C:\Command>type us.cmd ……コンソール(コマンドプロンプトの表示)を英語モードに切り替えるバッチファイル
@echo off
setlocal
rem Change the active CODE PAGE to 437 (United States)
chcp 437
C:\Command>type jp.cmd ……日本語モードに戻すバッチファイル
@echo off
setlocal
rem Change the active CODE PAGE to 932 (Japan)
chcp 932
C:\Command>
それぞれ、先頭に「@echo off」という記述があるが、これは実行中のコマンド列を画面に表示させないようにするための定型文である。こうしておかないと、いちいちコマンド列が表示されて煩わしくなる。ただし、バッチファイルのコーディング中やテスト中はこの文は入れずに、何が実行されるのかを確認した方がいいだろう。バッチファイルが完成したら、最後にこの行を追加しておく。
ちなみに「@echo off」ではなく単に「echo off」だと、この行そのものは表示され、次の行から非表示になる。さらにバッチでは行頭に「@」があると、その行だけは非表示になるが、いちいちすべての行頭に「@」を付けるのは現実的ではないので、通常は先頭で「@echo off」とする。
2行目にある「setlocal」は、環境変数に対する操作をローカル化するコマンドである。詳細は省略するが、@echo offと共に、決まり文句のようなものだと思っておけばよいだろう。setlocalがあると、このバッチファイル中で環境変数を作成したり、値を変更したりしても、その結果は外部へ伝わらない。
3行目には、いずれも「rem 〜」文があるが、これはコメントを表すコマンドであり、実行されることはない。バッチファイルの説明などを記述しておこう。
4行目にある「chcp 〜」が実際に実行されるコマンドである。まずコマンドプロンプトに手動で入力して実行し、そのコマンドが正しく起動できるかどうか確認してから、コマンド列をバッチファイルに貼り付けるとよいだろう。コマンドのヒストリーの確認方法などについては関連記事を参照していただきたい。
バッチファイルを実行するには、コマンドプロンプトや[ファイル名を指定して実行]ダイアログでバッチファイルのパス名を指定すればよい。だがいちいちフルパスで指定しなければならないのでは、とても面倒である。コマンドプロンプトの場合は、カレントフォルダー中にそのバッチファイルが存在すれば、フォルダー名の部分は指定しなくてもよいものの、最初にバッチファイルのあるフォルダーにcdコマンドで移動するのも、また面倒である。
バッチファイルをよく使うなら、どこか一カ所にバッチファイルをまとめて保存しておき、そのフォルダー名をPATH環境変数に登録しておくのがよい。例えば筆者は「C:\Command」というフォルダーを作成して、この中によく使うコマンドや自作のバッチファイル、(WSHやPowerShellの)スクリプトなどを保存している。そしてPATH環境変数の最後に「;C:\Command」を追加している。
PATH環境変数の設定方法については関連記事を参照していただきたい。環境変数には「ユーザー環境変数」と「システム環境変数」の2種類があるので、用途に応じていずれかのPATH環境変数の末尾に、バッチファイルを保存してあるフォルダー名を追加する(末尾ではなく前の方に追加すると、同じ名前のコマンドがあった場合に優先して実行される)。独立したフォルダーを用意せず、システムのデフォルトPATHに含まれる「C:\Windows」などにバッチファイルを保存すると、後でバッチファイルの更新などが面倒になるので、止めた方がいい。
バッチファイルでは通常、CUIのコマンドを起動することが多いだろう。しかしGUIを使うWindowsのアプリケーションプログラムを起動することもできる。例えば、以下は「WZ Editor 8(WZ Software)」という(筆者がいつも使っている)テキストエディターを起動するバッチの例である。
※「wz8.cmd」というバッチファイルの内容例(1行のみ)
"C:\Program Files (x86)\WZ EDITOR 8\wzeditor.exe" %*
ユーザーがインストールしたWindowsのアプリケーションは、通常は「C:\Program Files」や「C:\Program Files (x86)」などの下にインストールされていて、起動するには[スタート]メニューからGUI操作で目的のメニュー名を探さないと起動できないことが多い。
そこで、こうやってバッチファイルを用意しておくと、普段からコマンドプロンプトを使っている場合は、単に「wz8」というコマンド名を入力するだけですぐに起動できて便利である。Office Wordをよく使うなら、「C:\Program Files (x86)\Microsoft Office\Office15\WINWORD.EXE」を起動するようなword.cmdを作っておけばよいだろう。
任意のプログラムを起動するには、このように行の先頭に実行ファイルのフルパス名を記述し(空白文字が含まれる場合は、上の例のように引用符で囲むこと)、さらに「%*」という表記を追加しておく。
「%*」は、バッチファイルに渡された引数全体を表す記号である。例えば「wz8 a.txt b.txt c.txt」として起動すると、3つのファイル名を引数として、テキストエディターが起動されることになる(引数の表記方法については「help call」コマンドのヘルプを参照のこと)。
バッチファイルへの引数を1つずつ参照したい場合は、「%1」「%2」……「%9」とすればよい。ただし、この指定方法では最大で9つまでしか参照できない。10個目以降の引数を参照したい場合は「Shift」というコマンドを併用する。Shiftコマンドを実行すると、最初の引数(%1)が削除され(シフトアウトされ)、2つ目以降の引数が「%1」「%2」……「%9」で参照できるようになる。後述するgotoなどの制御構造と組み合わせれば、全ての引数を、例えば「%1」だけで順に参照できるようになる。詳細は「help shift」コマンドのヘルプを参照のこと。
バッチファイルへの引数はそのまま使うだけでなく、例えばパス名ならそれを分解して、パス部分、基本ファイル名部分、拡張子部分などに分解することもできる。詳細はやはり「help call」を参照していただきたい。
バッチファイルとして作成したコマンドは、コマンドプロンプトから起動するだけでなく、「ファイル名を指定して実行」でも起動できるようになる。例えば[Windows]+[R]キーで「ファイル名を指定して実行」ダイアログを表示させ、「wz8」と入力すると、先ほど作成したバッチファイルからWZエディターが起動される。
ただしこの場合、目的のアプリケーションのウィンドウだけでなく、実行中のバッチファイルのウィンドウ(実際にはコマンドプロンプトのウィンドウ)も表示される。このウィンドウはアプリケーションを終了するまで表示されたままになっており、これでは見栄えが悪いし、余計なウィンドウが表示されることによって、操作ミスを起こす可能性もある。バッチファイルの先頭に「@echo off」を入れても、コマンドプロンプトのウィンドウは表示される(echo offのために、画面は真っ黒のままだが)。
このような状況を避け、コマンドプロンプトのウィンドウを出さずに目的のアプリケーションを起動するには「start "" <パス名> %*」というコマンドにすればよい。startはコマンドプロンプトの内部コマンドで、指定された項目を起動するためのものである。startコマンドはデフォルトでは、起動したプログラムの実行終了を待たないので、バッチファイルはすぐに終了し、黒いコマンドプロンプトのウィンドウを見ることはなくなるだろう。
※「wz8.cmd」というバッチファイルの内容例(更新版)
start "" "C:\Program Files (x86)\WZ EDITOR 8\wzeditor.exe" %*
startコマンドは、実行ファイルだけでなく、さまざまな特殊フォルダーを開けるなど高機能である。startコマンドの第1引数にある「""」はアプリケーションのタイトルを設定する文字列だが、不要なので、このように空文字列にしておけばよい。startコマンドについては関連記事のTIPSや「help start」のヘルプを参照のこと。
バッチに対する引数を参照できるのは、「%1」や「%*」だけではない。それ以外にも環境変数やバッチ用のローカル変数などもいくらか定義されており、それらを参照したり、(単純ながら)文字列演算や数値演算させたりする機能も用意されている。
環境変数やローカルの変数は「%TMP%」のように、変数名を「%」で囲むと参照できる。あらかじめ定義されている代表的な変数については、関連記事や「help set」コマンドの説明を参照していただきたい。
あらかじめ定義されている「%DATE%」や「%TIME%」などに対して文字列演算や数値演算などを使うと、現在の日付や時刻、コンピューター名、ドメイン名などをベースにしたファイル名を合成できる。これを使って、例えば自動的に日付別にファイルをバックアップする、ログファイルを整理させるといったコマンドを作ることが可能だ。関連記事の例などを参考にしていただきたい。
Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.
@IT編集部では現在、編集スタッフを募集しています。編集経験は不問。 ITに関する経験のある方、ご応募お待ちしています。