バッチの実体は、コマンドラインで実行するコマンド列を順に並べた、単なるテキストファイルである。だがその利用に当たっては、幾つか注意するべき点がある。最後に、それらの注意点や、バッチをさらにうまく使うための方法などについてまとめておく。
バッチのコマンド名は任意に付けることができるが、すでに存在するコマンドと同じ名前を付けると、そちらの方が優先されて起動できないことがある。バッチファイル名をフルパス名や拡張子付きで呼び出せば起動できるが、トラブルの元なので避けるのが賢明だ。
バッチファイル中では、カレントフォルダやカレントドライブが意図していない場所になっていることがある(呼び出し元に応じて変わるため)。バッチの中でファイルやフォルダを利用する場合は、フルパス表記にするか、カレントドライブやカレントフォルダを変更するコマンド(cdやc:など)を最初に実行させて、曖昧性をなくすこと。
バッチは基本的にはユーザーとの対話をせずに動作させるものである。コマンドによってはユーザーに確認のメッセージを提示して、[Y]か[N]などの入力を待つことがある。だがこのようなコマンドをバッチ中で使用すると、処理がそこで止まってしまい、先へ進まなくなる。
コマンドにもよるが、ユーザーの介入なしに強制的に処理を進めるようなオプションがあれば、必ずそれを利用すること。
前ページのrobocopyの例では、robocopyのパラメーターとしてパス名を直接記述していたが、このようなバッチファイルは後で修正したり、再利用したりするのが面倒になりがちだ。こんな場合は、「環境変数」という、一時的な値の保存機能(プログラミング言語における変数のようなもの)を使って、整理するとよい。
環境変数に値を定義するには「set <名前>=〜〜」、参照するには「%<名前>%」とする(名前の大文字/小文字の違いは無視される)。これを使えば、場所を変更する場合はバッチファイルの先頭部分を編集するだけだし、コマンドが増えても対処は容易である。例えば次のようになる。
なお、ユーザーのホームとなっているフォルダ(この例で言えばC:\Users\user01)は、「USERPROFILE」という環境変数で参照できるので、さらに次のようにすることもできる。こうすればユーザー名が変わっても、そのまま利用できる。
利用可能な環境変数については、「set」コマンドを実行するか、以下のTIPSを参照していただきたい。
ところで、前ページの例では、ユーザーのドキュメントフォルダ(C:\Users\user01\Documents)にバッチファイルを保存していた。このバッチファイルを実行する場合、カレントフォルダをC:\Users\user01にするか(cd C:\Users\user01\Documentsとする)、常にフルパス表記でC:\Users\user01\Documents\hello.cmdと指定する必要がある。
だがこれはとても面倒だ。場所を覚えにくいし、使うのも面倒だし、他のユーザーに渡して使ってもらうの大変である。
Windows OSにはPath環境変数という機能があり、この変数にセットされている場所(フォルダ)なら、フルパス表記でなくても実行できるようになっている。
現在のPath環境変数の値は、コマンドプロンプト上で「path」コマンドか「set path」コマンドを実行すると確認できる。
ちょっと長いが、「PATH=」の後ろに、「C:\WINDOWS」や「C:\Program Files\〜」など、複数のフォルダ名が「;」記号で区切られて並んでいる。コマンドプロンプトがコマンドを探す場合、まずカレントフォルダを検索し、そこになければ、このPATH=で示される場所を左から順に探すようになっている。
例えばコマンドプロンプト上で「notepad Hello.cmd」と入力すると、まずカレントフォルダにnotepadという名前のファイルがないかどうかを検索する。見つからなければPath環境変数を順にスキャンし、最終的にはC:\WINDOWS\System32\notepad.exeを見つけて、これを起動する。
自分で作成したバッチファイルもこのPathの指すいずれかのフォルダに保存しておけば、「hello」と入力するだけで起動できて便利である。
とはいえ、元からあるシステム設定を変更するのは望ましくない。C:\CommandやD:\Commandといったフォルダを作成し、その場所をPathに追加しておくとよいだろう。そして作成したバッチファイル(や自作のコマンド、ツールなど)をその中に保存するようにしておけばよい。
Path環境変数を設定するには、まずWindowsの検索窓で「環境変数」検索する。
検索結果のうち、[システム環境変数の編集]か[環境変数を編集]のいずれかを起動する。
環境変数の画面が開いたら、上と下、いずれかに表示されている「Path」変数を選んで[編集]をクリックする。ユーザー環境変数側のPathに追加すると、そのユーザーのみ、システム環境変数側のPathに追加すると、システムを使う全ユーザーで、そのPathが有効になる。
[編集]をクリックして編集画面を表示させ、バッチファイルを保存したフォルダ(C:\Commandなど)を、現在のPathに追加しておけばよい。すでにある値とは、「;」(セミコロン)で区切っておくこと。追加する場所はどこでもよく、前にあるほど、コマンドの検索が優先される。コマンドプロンプトを再起動すると、Path環境変数が有効になっているはずだ(Pathコマンドで確認する)。
バッチファイルが完成したら、それをタスクスケジューラに登録すると、定期的に実行できるようになる。毎時間、毎日、毎週など、任意のタイミングで実行できるようになる。タスクスケジューラの使い方については、以下の記事を参照していただきたい。
ファイルを固定的な場所ではなく、例えば日付別にフォルダを作って、そこへ毎日コピーしたい、という用途もあるだろう。その場合は、コピー先(先のバッチファイルでいえば、「set dst=〜」の部分)を、日付別のフォルダ名になるようにすればよい。
最初の例で、「echo %date%」として日付を表示できることを示したが、これを応用すれば日付をフォルダ名にすることも可能である。「%date%」で「2017/09/01」のような文字列が入手できるので、ここから数字部分だけを取り出せばよい(Windows OSでは「/」をファイル名に使えないため)。
ただしこの部分は少々面倒なため、詳細については以下のTIPSを参照していただきたい。
以上、全3回でコマンドプロンプトの基礎からバッチファイルまでを簡単に紹介してきた。GUIが進化しても、例えばファイルの定期的なバックアップといった作業なら、copyコマンド1つで済むCUIはまだまだ有用だろう。コマンドプロンプトと言えば、Windows OSよりも前からある、非常に古めかしい技術と思われるだろうが(実際古いが)、むしろ何も進化していない分だけ、互換性だけは非常に高い(本連載で紹介している機能は20年以上も前から何も変わっていない)。今後もまだまだ、コマンドプロンプトの必要性はなくならないだろう。
Copyright© Digital Advantage Corp. All Rights Reserved.