本記事ではWindows上でバッチファイル を作るにあたって知っておきたい
- コマンド出力を抑制する方法
- メッセージを出力する方法
- カレントディレクトリを変更する方法
- 変数を利用する方法
- 条件式を利用する方法
- ファイルを削除 移動 コピー 名称変更する方法
- 一時停止の方法
- メッセージ出力後に一時停止する方法
- タイマーを組み込む方法
- コメントを記述する方法
- 変数をローカル化する方法
といったバッチファイルの基本テクニックを実例を使って紹介します。
目次
バッチファイルの基本テクニックを知ろう
ここでは以下のバッチファイルを例に、知っておきたいバッチファイルの基本部分について紹介します。
このバッチファイルの個別部分は
#23 の記事中で説明していますので
そちらを参照してくださいね。
@echo off
setlocal
rem スリープタイマ値を設定する
set wait_time=1
echo 01.ダウンロードフォルダに移動
timeout /t %wait_time% > nul
cd %HOMEPATH%\Downloads
if exist 130001_tokyo_covid19_patients.csv (
echo 02.旧CSVファイルを削除
timeout /t %wait_time% > nul
del 130001_tokyo_covid19_patients*.*
)
echo 03.新CSVファイルをダウンロード
timeout /t %wait_time% > nul
"C:Program Files (x86)MicrosoftEdgeApplicationmsedge.exe" https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv
set /P a="04.新CSVファイルのダウンロードが終わったら何かキーを押してください . . ."
echo 05.デスクトップに移動
timeout /t %wait_time% > nul
cd %HOMEPATH%\Documents\Desktop
echo 06.130001_tokyo_covid19_patients.csv から T0000_東京都コロナ発症状況_マスタ を作成
timeout /t %wait_time% > nul
16_01.accdb
echo 07.T0000_東京都コロナ発症状況_マスタ から T1040_日付_退院者数_入院者数_退院率.xlsx を作成
timeout /t %wait_time% > nul
18_02.accdb
echo 08.T1040_日付_退院者数_入院者数_退院率.xlsx を T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx ヘコピー
timeout /t %wait_time% > nul
23_01.accdb
echo 09.ExcelT1040_日付_退院者数_入院者数_退院率_グラフ.xlsxを起動
timeout /t %wait_time% > nul
T1040_日付_退院者数_入院者数_退院率_グラフ.xlsx
endlocal
pause
このサンプルのバッチファイル 23_01.bat は以下のようにユーザーの Windows PCのデスクトップ上に保存されています。
いかがですか?
それでは詳しく説明しますね。
コマンド出力を抑制する方法
この バッチファイル 23_01.bat の1行目にある
@echo off
というコマンドはこのバッチファイルで echo コマンド を除いた以後の実行コマンドそのもの、あるいはその実行結果を以下のようにコマンドプロンプト上に表示しないように指定します。
逆に以後の実行コマンドそのもの、その実行結果を表示したい場合は
@echo on
と記述します。
メッセージを出力する方法
バッチファイル 23_01.bat の 8, 13, 18, 24, 28, 32, 36, 40行目にある echo コマンド、例えば
echo 01.ダウンロードフォルダに移動
は上のコマンドプロンプトに echo コマンド以降のテキスト
01.ダウンロードフォルダに移動
を表示します。
カレントディレクトリを変更する方法
バッチファイル 23_01.bat の 10, 26行目にある cdコマンド、つまり
cd %HOMEPATH%\Downloads
や
cd %HOMEPATH%\Documents\Desktop
はこのバッチファイルのなかで作業中ディレクトリ(=カレントディレクトリ)を変更するコマンドです。
Windows の世界でフォルダと呼ばれているファイルの階層構造の概念は Windows の前身の MS-DOS や Linux / Unix 系の OS で ディレクトリ と呼ばれています。
バッチファイルは MS-DOSが開発された時代に Linux/Unix 系の shell(シェル)をモデルにして作られたので、フォルダのことをディレクトリと呼ぶわけです。
ちなみにこの cd コマンドの中に現れる %HOMEPATH% は Windows の中で予め定義された 環境変数 と呼ばれるもので、異なるユーザー、Windows 10 搭載 PCで処理を共通化できるように準備されたものです。
バッチファイルを書くとき、以下の環境変数は覚えておくと便利ですよ。
環境変数名 | 値 | 備考 |
---|---|---|
%COMPUTERNAME% | コンピューター名 | |
%HOMEDRIVE% | C:\ | %HOMEDRIVE% の値は Windows 10 のインストール状況により変わります。例えば SSD起動型 のPCでは D:\ 等になっている場合があります。 |
%HOMEPATH% | \Users\ユーザー名 | |
%USERNAME% | ユーザー名 | |
%USERPROFILE% | C:\Users\ユーザー名 | SSD起動型 のPCでは D:\Users\ユーザー名 等になっている場合があります。 |
その他の環境変数については Microsoft の公式ページ を参照してください。
ここで使用している a という変数は
メッセージ出力後に一時停止したいために
仮に決めたダミーの変数です。
なので、このバッチファイルの中では
%a% という形で参照 されていません。
変数を利用する方法
バッチファイル 23_01.bat の 中にたびたび現れる2つの % で囲んだ %wait_time% のような書き方はバッチファイルにおいて変数を参照するときの書き方です。
この変数への値の設定は set コマンドを使います。例えばこのサンプルバッチファイル 23_01.bat では 6行目で
set wait_time=1
というように wait_time という変数に 1がを設定しているので、後ほど紹介する timeout コマンドの第二パラメーター %waittime%
timeout /t %wait_time% >nul
は
timeout /t 1 >nul
つまり1秒タイミングをとるという意味と同じになります。
この >
はリダイレクトといい、出力先を指定したファイルに変更します。
ただし nul
は空(のファイル)という意味なので、結果として >nul は前に実行し、コマンドプロンプトに表示すべき内容を抑制する意味になります。
また > nul
を付けただけだと、エラーメッセージが出力されてしまうので
例えば16行目では さらに 2>&1 を付けると、エラーメッセージも抑制することが出来ます。
del 130001_tokyo_covid19_patients*.* > nul 2>&1
この 2>
はエラーメッセージ(標準エラー出力)をリダイレクトするという意味で、行き先の&1
は通常のコマンドライン(標準出力)という意味です。
つまり、 2>&1
で標準エラー出力を標準出力にリダイレクトし、 > nul
でこの標準出力を空のファイルにリダイレクトしているので、結果として標準エラー出力も空のファイルにリダイレクトされるというわけです。
またバッチファイルを起動する時にパラメータを指定することができますが、呼び出し時の 第1パラメータ、第2パラメータ を %1、%2 という変数で参照することもできます。 またこれらのパラメータが空白を含むとき、この文字列をダブルクォーテーション ” “ で囲んでパラメータを指定することがありますが、変数 %~1、%~2 という表現を使うことでこれらのパラメータを ダブルクォーテーション ” “ 抜きで取り出すこともできます。 こうしたバッチファイルの引数に付いてより詳細に知りたい方は必要に応じて 以下の記事も参考にしてくださいね。 |
条件式を利用する方法
バッチファイル 23_01.bat の 12 から 16 行目の if で始まり ) で終わる次のような書き方をすると、条件に応じた分岐処理を記述することができます。
if 条件式 (
条件式が真のとき実行したいコマンド
)
条件式に書けるのは以下のような条件式です。
条件式 | 条件式の評価結果 |
---|---|
%var% == “abc” | 変数 var の値 が 文字列 “abc” と等しいとき 真 |
exist ファイル名/フォルダ名 | もし ファイル名/フォルダ名 で指定された ファイルがカレントディレクトリに存在したら 真 |
not exist ファイル名/フォルダ名 | もし ファイル名/フォルダ名 で指定された ファイルがカレントディレクトリに存在しなかったら 真 |
ちなみに、条件を複数に分岐したい場合は
if 条件式 (
条件式が真のとき実行したいコマンド
) else (
条件式が偽のとき実行したいコマンド
)
や
if 条件式1 (
条件式1が真のとき実行したいコマンド
) else if 条件式2 (
条件式1が偽 で 条件式2が真 のとき実行したいコマンド
) else (
条件式1が偽 で 条件式2も偽 のときに実行したいコマンド
)
というように重ねることで分岐の数を増やすこともできます。
ファイルを削除 移動 コピー 名称変更 する方法
バッチファイル 23_01.bat の 15行目の
del 130001_tokyo_covid19_patients*.*
はカレントディレクトリ配下にある ファイル名が 130001_tokyo_covid19_patients*.* に一致する全てのファイルを削除します。
この * という文字は0文字以上の全ての文字に合致する文字列を示しておりワイルドカードと呼ばれます。
同様に ? という文字も1文字の全ての文字に合致するワイルドカードです。
バッチファイルの中では del コマンド`の他にも、コマンドプロンプトの中で実行可能なコマンドを記述できます。
以下に del コマンド同様、バッチファイルの中でよく使われるファイル関連のコマンドを紹介しておきます。
コマンド形式 | 意味 |
---|---|
del ファイル名 | ファイルを削除します |
copy 元ファイル名 先ファイル名 | 元ファイルを先ファイルにコピーします |
rename 元ファイル名 先ファイル名 | 元ファイルの名前を先ファイルに変更します |
move 元ファイル名 先ファイル名 | 元ファイルを先ファイルに移動します |
mkdir フォルダ名 | カレントディレクトリに フォルダ名 で指定したフォルダを作成します |
一時停止の方法
バッチファイル 23_01.bat の 45行目の pause コマンド
pause
を使うとバッチファイルの処理を一時的に停止することができます。
停止中のバッチファイルを再開させるには ENTER キーを入力します。
メッセージ出力後に一時停止する方法
バッチファイル 23_01.bat の 22行目の setコマンド
set /P a="04.新CSVファイルのダウンロードが終わったら何かキーを押してください . . ."
は 2行目の set コマンド同様に変数に値を設定するコマンドですが、設定値をコマンドの中に直接記述するのではなく、コマンドプロンプトに指定した文字列を表示したあと、バッチファイルを停止し、ユーザーに値の入力を促します。
つまり、この動作を利用すればバッチファイルでメッセージ出力後に一時停止することができます。
ここで使用している a という変数は
メッセージ出力後に一時停止したいために
仮に決めたダミーの変数です。
なので、このバッチファイルの中では
%a% という形で参照 されていません。
タイマーを組み込む方法
バッチファイル 23_01.bat の 9, 14, 19, 25, 29, 33, 37, 41行目の timeout コマンド
timeout /t %wait_time% >nul
は この timeout コマンドのところで %wait_time% で指定された秒数だけ時間待ち(休止、スリープ)するコマンドです。
このコマンドの 最後の >nul はこのコマンドの結果を nul に出力する(=出力しない)という意味です。
コメントを記述する方法
バッチファイル 23_01.bat の 5行目の remコマンド
rem スリープタイマ値を設定する
はバッチファイルの中にコメントを記述するコマンドです。
このコメントはバッチファイルの実行には影響を与えませんが、それぞれの部分が何のためのものなのかをコメントで記述することで、そのバッチファイルの意味付けを理解しやすくします。
変数をローカル化する方法
バッチファイル 23_01.bat の 3行目の setlocal コマンド
setlocal
および 44 行目の endlocal コマンド
endlocal
はこのバッチファイルの中で定義した変数をこのバッチファイルの中でのみローカル化( setlocal コマンド)、およびローカル化解除( endlocal コマンド)します。
この setlocal コマンド、endlocal コマンドは、あるバッチファイルから別のバッチファイルを呼び出すようなケースで、呼ぶ側のバッチファイルと呼ばれる側のバッチファイル間の変数のスコープ(参照可能範囲)を制御する際に特に重要になります。
このバッチファイル例では
%a% が変数でしたね。
まとめ
本記事では Windows 上でバッチファイル を作るにあたって知っておきたい
- コマンド出力を抑制する方法
- メッセージの出力する方法
- カレントディレクトリを変更する方法
- 変数を利用する方法
- 条件式を利用する方法
- ファイルを 削除 移動 コピー 名称変更する方法
- 一時停止の方法
- メッセージ出力後に一時停止する方法
- タイマーを組み込む方法
- コメントを記述する方法
- 変数をローカル化する方法
といったバッチファイルの基本テクニックについて駆け足で紹介しました。
この記事が少しでも皆さんのバッチファイルへの理解の助けになれば幸いです。
いつも記事を読んで頂きありがとうございます~
今日の調子はいかがですか?