連載
» 2015年06月26日 05時00分 UPDATE

Tech TIPS:バッチファイルの基本的な使い方 (1/2)

Windowsの管理業務では、コマンドプロンプトを使った作業も少なくない。いつも決まったことを行う定型処理が多ければ、バッチファイルにしていつでも簡単に実行できるようにしておこう。本記事では、基本的なバッチファイルの作成/利用方法についてまとめておく。

[打越浩幸,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象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」を追加している。

 環境変数には「ユーザー環境変数」と「システム環境変数」の2種類があるので、用途に応じていずれかのPATH環境変数の末尾に、バッチファイルを保存してあるフォルダ名を追加する(末尾ではなく前の方に追加すると、同じ名前のコマンドがあった場合に優先して実行される)。独立したフォルダを用意せず、システムのデフォルトPATHに含まれる「C:\Windows」などにバッチファイルを保存すると、後でバッチファイルの更新などが面倒になるので、止めた方がいい。PATH環境変数の設定方法については、次の関連記事を参照していただきたい。

バッチファイルの場所をPATH環境変数に登録する バッチファイルの場所をPATH環境変数に登録する
バッチファイルを簡単に起動できるようにするには、バッチファイルの場所をPATH環境変数に登録しておく。
  (1)環境変数は、コントロールパネルから呼び出せる「システムのプロパティ」画面で設定する。
  (2)[詳細設定]タブを選択して、一番下に表示されている[環境変数]ボタンをクリックする。
  (3)これはユーザーごとの環境変数の設定。
  (4)このPATH環境変数を選んで[編集]ボタンをクリックし、末尾にバッチファイルのフォルダ名をセミコロンで区切って追加する。PATH変数が存在しない場合は[新規]ボタンを押して追加する。
  (5)全ユーザーに対してバッチファイルの実行を許可するなら、こちら側のPATH環境変数の値を変更する。
  (6)このPATHの末尾に該当フォルダ名を追加する。
  (7)PATHEXT環境変数には、実行可能なファイルの拡張子が登録されている。デフォルトでは.BATと.CMDの両方が含まれているので、いずれの拡張子であってもバッチファイルとして利用できる。

●バッチファイルからGUIのプログラムを起動する

 バッチファイルでは通常、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」を参照していただきたい。

●startコマンドでプログラムを起動する

 バッチファイルとして作成したコマンドは、コマンドプロンプトから起動するだけでなく、「ファイル名を指定して実行」でも起動できるようになる。例えば[Windows]+[R]キーで「ファイル名を指定して実行」ダイアログを表示させ、「wz8」と入力すると、先ほど作成したバッチファイルからWZエディターが起動される。

 ただしこの場合、目的のアプリケーションのウィンドウだけでなく、実行中のバッチファイルのウィンドウ(実際にはコマンドプロンプトのウィンドウ)も表示される。このウィンドウはアプリケーションを終了するまで表示されたままになっており、これでは見栄えが悪いし、余計なウィンドウが表示されることによって、操作ミスを起こす可能性もある。バッチファイルの先頭に「@echo off」を入れても、コマンドプロンプトのウィンドウは表示される(echo offのために、画面は真っ黒のままだが)。

実行中のバッチファイルのウィンドウが表示された状態 実行中のバッチファイルのウィンドウが表示された状態
ファイル名を指定して実行で先ほどの「wz8」というバッチファイルを起動したところ、目的のエディターだけでなく、なぜか裏側にコマンドプロンプトのウィンドウも表示されている。
  (1)バッチファイルを起動すると、まずコマンドプロンプトが起動し、その中でバッチファイル中のコマンドが順次実行される。
  (2)バッチファイルの先頭にある行(エディターの起動コマンド)を実行しているところ。エディターが終了するまで戻ってこないので、コマンドプロンプトのウィンドウがずっと表示されたままになっている(エディターが終了するまで、キー入力も受け付けない)。
  (3)起動されたエディター。これを終了させると、バッチファイルに制御が戻り、コマンドプロンプトが閉じることになる。

 このような状況を避け、コマンドプロンプトのウィンドウを出さずに目的のアプリケーションを起動するには「start "" <パス名> %*」というコマンドにすればよい。startはコマンドプロンプトの内部コマンドで、指定された項目を起動するためのものである。startコマンドはデフォルトでは、起動したプログラムの実行終了を待たないので、バッチファイルはすぐに終了し、黒いコマンドプロンプトのウィンドウを見ることはなくなるだろう。

※「wz8.cmd」というバッチファイルの内容例(更新版)

start "" "C:\Program Files (x86)\WZ EDITOR 8\wzeditor.exe" %*



 startコマンドは、実行ファイルだけでなく、さまざまな特殊フォルダを開けるなど高機能である。startコマンドの第1引数にある「""」はアプリケーションのタイトルを設定する文字列だが、不要なので、このように空文字列にしておけばよい。startコマンドについては、次の関連記事や「help start」のヘルプを参照のこと。

●バッチで利用できる環境変数について

 バッチに対する引数を参照できるのは、「%1」や「%*」だけではない。それ以外にも環境変数やバッチ用のローカル変数などもいくらか定義されており、それらを参照したり、(単純ながら)文字列演算や数値演算させたりする機能も用意されている。

 環境変数やローカルの変数は「%TMP%」のように、変数名を「%」で囲むと参照できる。あらかじめ定義されている代表的な変数については、次の関連記事や「help set」コマンドの説明を参照していただきたい。

 あらかじめ定義されている「%DATE%」や「%TIME%」などに対して文字列演算や数値演算などを使うと、現在の日付や時刻、コンピュータ名、ドメイン名などをベースにしたファイル名を合成できる。これを使って、例えば自動的に日付別にファイルをバックアップする、ログファイルを整理させるといったコマンドを作ることが可能だ。次の関連記事の例などを参考にしていただきたい。

       1|2 次のページへ

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。