バッチファイルの書き方(その1)


(2012年4月24日追記)
バッチファイルを含む、Windows系のスクリプトについて学べるサイトをまとめました。合わせてご覧ください。


(追加)

    • 2008/12/29 - (その2)を書きました→こちら
    • 2009/03/23 - (その3)を書きました→こちら


このブログでも何度かバッチファイルのサンプルを載せた事があるせいで、バッチファイルについての検索で来られる方が増えています。
最近シェルスクリプトの書き方の記事などが増えてきているようなので、これをいい機会としてバッチファイルの書き方についての書き方をまとめてみます。

★バッチファイルとは...

バッチファイルとは、DOSコマンドを記述したスクリプトファイルです。
やりたい事を記述しておけば、それを実行(ダブルクリック or call)するだけで処理をすることが出来ます。


例えば、hostsファイルの編集をしたい場合には通常以下の手順で編集します。

    1. エクスプローラを起動する
    2. hostsファイルのあるフォルダを開く
    3. hostsファイルを選びメモ帳などで開く


重い処理をしている時にはエクスプローラはなかなか開きませんし、さらにあらかじめ「送る」にメモ帳を仕込んでおくか、そうでなければメモ帳を開いておかないとhostsファイルは開けません。チョーめんどくさい。
これをバッチファイルにすればわずか一行です

notepad %windir%\system32\drivers\etc\hosts


これを書いたファイルをxxx.bat(xxxの部分は分かりやすい好きな名前をつけてください)としておけば、それを実行するだけでhostsファイルが開くようになります。チョー便利。

★バッチファイルで使用するコマンドとは....

バッチファイルで使用出来るコマンドは大きく2つ。

    1. DOSの組み込みコマンド
    2. ↑以外の実行可能プログラム


1.については以下の手順で使用出来るコマンドの一覧を見ることが出来ます。

      1. [スタート]ボタン→[ファイル名を指定して実行]を開く
      2. cmd と入れて[OK]ボタンを押す
      3. help と入れてEnterを押す


※結果サンプル




基本的にはOSごとに使用出来るコマンドが変わりますが、下位互換性は考慮されているので同じコマンドであれば、OSごとの差異はあまり違いを意識する事はありません。
*1


2.については端末によって、入っているプログラム(またはそのインストール先)は異なりますので、端末ごとに何が使えるのかどうか確認してください。
プログラムによってはインストール先が環境変数のPATHに追加されていたり、独自の環境変数を設定するものもありますのでそれを利用することで端末ごとではなく、インストール済みの端末共通の記述も可能です。

★条件分岐やループ

if文やforループが使用出来ます。
ただし記述の仕方に癖があるので必ずヘルプを一読してください。

※ifのヘルプ

C:\> if /?


※forのヘルプ

C:\> for /?

★バッチファイルを書く上でよく使うもの

1. 先頭に @ECHO OFF を記述
 バッチファイルの頭に@ECHO OFFという記述を付ける事が多いです。
 これは @とECHO OFFに分解出来ます。

 (1) @ を行の先頭につけるとその行のコマンドがエコーバックされない
  説明ばかり書いても分かりにくいので実際にバッチファイルで説明します。


  こんなバッチファイルを作成して実行してみます。

ECHO I am itotto!!
@ECHO I am itotto!!

  実際に実行してみるとこうなります。



  @を付けないで実行した方は実行したコマンド自体も画面に表示されています。
  つまり、


  のような事です。
  その下の@が付いたコマンド実行についてはコマンド自体は表示されていません。


  つまり、@をつけることで実行したコマンドを表示しないという効果があることが分かります。
  (具体的な効果についてはのちほど)


 また、ECHO OFF というコマンドについてはこのコマンド以降の実行コマンド自体を表示しないように設定されます。
 つまり、全てのコマンドの行頭に@が付いているのと同じ効果が期待出来るのです。


 このようにコマンド自体を表示しない効果としては、画面を見やすくするというメリットと、何を実行しているのか経過が分かりにくいというデメリットがあります。
 そのため、作成中やデバッグ中はこの効果を設定しないようにしておき、完成後にこの効果を設定するのが良い方法です。


2. 使用する変数を定義してコメントを付ける

 変数の定義にはSETコマンドを使用します

SET xxxx=xxxx


 変数はどこでも定義出来るのですが、なるべく冒頭で一度は定義してかつコメントをつけておいた方が賢明です。

:// デバッグ用変数(0=通常,1=デバッグ)
SET xxxx=xxxx


 バッチファイルでは変数は宣言しなくとも使用することが可能です。そのため、一文字間違った変数を使用しても分からない事が少なくありません。一度ちゃんと初期化しておけば、間違いにくくなります。
 あとコメントは付けておかないと何の変数か分からなくなる事が結構あります。


3. ()の使い方に気をつける

 ()は複文をまとめるのに使用出来ますがネストは出来ません。つまり、複文に複文を混ぜ込む事は出来ません。

IF "%WINDIR%"=="...." (
 IF EXIST D:\xxxx ( ←ここでエラーになる
 )
)


 ちなみに複文のみならず、ECHOの引数中に()を書くのも不可能です。

IF "%WINDIR%"=="...." (
 ECHO (HOGEHOGE) ←これもエラー
)


この()は結構はまりやすいので要注意です。


次回は実際に簡単なバッチファイルをサンプルとして説明します。

*1:Vistapingの結果が日本語化されたりなど、全く無いわけではないので要確認