Windowsのコマンドプロンプトを使えば、大量のファイルをコピーしたり名前を変えたりが、手作業よりも効率的に実行できる。
さらに、そういった定型作業を定期的に行う場合、バッチファイルにまとめておくと、簡単に同じ手順を繰り返し実行できるようになる。
何かしらのプログラミング言語でツールを開発することも出来るのだが、複数の端末で同じ操作を行うような場合に、各端末にツールの動作に必要なランタイムなどをインストールする必要があったりする。
また、会社支給の端末だと、ソフトウェアのインストール自体が禁止されている事も多い。
コマンドプロンプトやバッチファイルはWindowsに標準で搭載されている機能なため、インストール作業は不要である。
最近では、同じくWindows標準搭載であるPowerShellが使われる事も多いが、バッチファイルも根強く残っている。
ただし、バッチファイルは機能がそんなに豊富ではないし、文法にもかなり癖がある。
単純な作業を自動化するのにバッチファイルは有用だが、複雑なことを実現したい場合は、別のプログラミング言語を使用した方が良い。
たまに意固地になって難解なバッチファイルを作る人を見かけるのだが、あくまで目的を達成するための手段の1つに過ぎないため、固執するものではないと思う。
バッチファイルの作り方
Windowsのバッチファイルは単なるテキストファイルであり、実行したいコマンドを列挙して、保存すれば作成できる。
ファイルの拡張子は「.bat」か「.cmd」のいずれかにしておく(どっちでも違いはない)。
ファイル保存時の文字コードは「ANSI」か「Shift-JIS」形式にする。
コマンドプロンプトのデフォルトの文字コードはCP932(マイクロソフト拡張版のShift-JIS)になっていて、「Unicode」や「UTF-8」形式などにすると文字化けが発生する。
バッチファイルの雛形
バッチファイルはコマンドプロンプトで実行できるコマンドを羅列するだけでも動作はするが、定型的に書いた方が良い部分がある。
@echo off setlocal pushd "%~dp0" setlocal enabledelayedexpansion rem ここにバッチ処理を記載 popd pause
@echo off
実行するコマンドを画面に表示しないようにするコマンド。
コマンドの実行結果だけが画面に表示されるようになる。
setlocal
環境変数のローカル化開始。
バッチ処理内で設定した環境変数が、バッチ外に影響を及ぼさないようにする。
バッチファイル中で環境変数を作成したり、値を変更したりしても、バッチの終了後には元の状態に戻る。
意図的に環境変数のローカル化を終了する場合は「endlocal」コマンド。
pushd “%~dp0”
実行しているバッチファイルが存在するディレクトリをカレントディレクトリにする。
類似のコマンドに「cd /d “%~dp0″」があるが、pushdの方がUNCなどのネットワークフォルダ(\\ホスト名\~のようなパス)にも対応できるので汎用性が高い。
setlocal enabledelayedexpansion
遅延環境変数の展開を有効にする。
バッチファイルの場合、デフォルトだとif文やfor文が1つのコマンドとして扱われるため、コマンド内にある処理もまとめて1つのブロックとして読み込まれてしまい、if文やfor文内にある変数の代入処理は、if文やfor文が終わった後に反映される。
結果的に、if文やfor文内では変数が正しく機能しない。
遅延環境変数の展開を有効にすると、if文やfor文内にある処理が逐次解釈されて実行されるようになり、変数が正しく機能するようになる。
なお、バッチファイルで変数を使用する際は「%変数名%」とするが、遅延環境変数を使用する場合は「!変数名!」と記述しないと正しく動作しない。
rem ~
コメント行。
popd
pushdで移動したディレクトリを戻す。
pause
バッチ処理を一時停止する。
何かキーを押せばバッチ処理が再開される。
バッチ処理の結果を目で確認したい時に使用する。
