- note -

Batch

1/8

バッチプログラミング基本事項まとめ   - Last modified:2012/12/23

バッチ … コマンドプロンプトに一連のコマンドを実行させるためのスクリプトファイルのこと。 なんだかんだで、バッチを覚えておくと役に立ちます。
ここではバッチでプログラミングを行う際に必要となるであろう
基本知識等を(備忘録的なものとして)列挙していきたいと思います。

■特殊記号一覧(※)

※一部の記号はコマンドによって意味が変わる。 >   … リダイレクト文字。 標準出力を指定したデバイスへの上書きに切り替える。
>>  … リダイレクト文字。 標準出力を指定したデバイスへの追記に切り替える。
<   … リダイレクト文字。 標準入力を指定したデバイスからの入力に切り替える。
1>  … >と同じ。
2>  … 標準エラーの出力先を切り替える。
0<  … <と同じ。
&x  … [&+数字]で入出力先のハンドル(ディスクリプタ)を表す。
%   … 環境変数の展開に使用。 解析時%で挟んだ部分がその変数の中身に置き換わる。
実行時!で挟んだ部分がその変数の中身に置き換わる … ただしこっちは遅延展開が有効になっていないと機能しない。 !   … 環境変数の展開に使用。 実行時!で挟んだ部分がその変数の中身に置き換わる。
%x  … [%+数字]でバッチパラメータ(引数)を表す。
%*  … パラメータとして渡された全ての引数を表す。
環境変数の展開 … 変数展開はコマンドプロンプト上とbatファイルで動作が異なり、batファイルでは該当する変数がない場合その部分が展開時に消え、コマンドプロンプト上ではfor変数の%が一つとなる。 %%x … for変数の宣言と展開に使用。 xは任意の1文字。
"   … 空白を含んだパスの表現、特殊記号のエスケープに使用。
?   … ワイルドカード。 任意の0-1文字にマッチする。
*   … ワイルドカード。 任意の文字列にマッチする。
^   … 後ろに続く1文字をエスケープする。 行末にある場合は次の行との連結。
\   … パスの区切り文字。
.   … カレントディレクトリを表す。
..  … カレントディレクトリの親ディレクトリを表す。
:   … ラベルの作成に使用。
文 … 複合文、又は単文。 @   … 文頭に書くことにより、その文のechoをoffにする。
&   … 単一行において複数のコマンドを連結して複合文にする。
() ()で囲まれたコマンドを全て連結して複合文にする。
|   … パイプ記号。 コマンドの標準出力先が|の後ろに書いたコマンドの標準入力となる。
&& &&の前のステートメントが成功したときだけ&&の後ろのステートメントを実行する。
|| ||の前のステートメントが失敗したときだけ||の後ろのステートメントを実行する。

■予約語一覧

nul … nullデバイスを表す予約語。 出力結果を捨てる場合、入力処理を省く場合などに使用。
con … コンソールデバイスを表す予約語。 コマンドプロンプトのデフォルト入出力先となる。
prn … パラレルポートデバイスを表す予約語。 現在ではあまり使われない。
lptx … [lpt+数字]でプリンタポートデバイスを表す予約語。 現在ではまず使われない。
aux … RS-232Cデバイスを表す予約語。 現在ではほとんど使われない。
comx … [com+数字]でCOMポートデバイスを表す予約語。 現在では以下略。

■特殊環境変数一覧

特殊環境変数 … これらの環境変数は動的に値が変化する。 %cd% … カレントディレクトリ
%date% … 現在の日付
%time% … 現在の時刻
%random% … 0~32767の乱数
%errorlevel% … 現在のエラーレベル
%cmdextversion% … cmd.exeのバージョン
%cmdcmdline% … cmd.exeを起動したときのコマンドパラメータ
%=x:% … %=で始まる変数はそれぞれの条件を満たしたときに作成され、それ以降はset ""で内容を確認することができるようになる。 %=x:% … ドライブ毎のカレントディレクトリ(x = ドライブレター)
%=ExitCode% … 現在のエラーレベルの16進数8桁表記
%=ExitCodeAscii% … 現在のエラーレベルのAsciiコードに対応する文字

■変数展開時の修飾子一覧(※)

※これらの修飾子はパラメータ変数、for変数にのみ使用できる。 ただし%~*という記述は使用できない。 また、修飾子は組み合わせて使うことができる。 %~1 … ダブルクォーテーションを削除して%1を展開する。
%~f1 … %1を完全修飾パス名(フルパス)に展開する。
%~d1 … %1をドライブ文字だけに展開する。
%~p1 … %1をパスだけに展開する。
%~n1 … %1をファイル名だけに展開する。
%~x1 … %1を拡張子だけに展開する。
%~s1 … 8.3形式で%1をフルパスに展開する。
%~a1 … %1をファイル属性に展開する。
%~t1 … %1をファイル更新時の日付/時刻に展開する。
%~z1 … %1をファイルサイズに展開する。
%~$x:1 … %1を、%1が初めに見つかった変数xのディレクトリパスに展開する(xの書式はPATHと同じ)。

■よく使うコマンドとオプション

set … 変数に値(文字列)をセットする。
set /a … 式の計算結果を変数にセットする。
set /p … 標準入力から入力された値を変数にセットする。
if … 条件が真のときコマンドを実行する。
if not … 条件が偽のときコマンドを実行する。
if exist … 指定したファイルが存在するときコマンドを実行する。
セット … セットにワイルドカードを指定したときのみ、カレントディレクトリのファイルセットが対象となる。 for … セットの要素一つずつに対してコマンドを実行する。いわゆるforeachに相当。
     一般的な方のforは/lオプションになる。
for /r … 指定したフォルダ(デフォルトはカレント)から再帰的に各階層のフォルダでforを実行する。
for /f … 何らかの入力値をトークンに分解し、行単位の解析結果でコマンドを実行する。
for /l … for変数をループカウンタとして、指定したループ回数だけコマンドを実行する。

■変数の部分文字列展開

n文字目から … 例にあるように、先頭文字が0文字目となる。 環境変数は%x:~n,m%という書式によって「n文字目からm文字だけ」という部分文字列展開ができる。
ex)変数xの内容がABCDEFGのとき

n文字目から、という指定方法
%x:~2% → CDEFG

m文字だけ、という指定方法
%x:~0,3% → ABC

n文字目からm文字だけ、という指定方法
%x:~2,4% → CDEF

後ろから数えてn文字目から、という指定方法
%x:~-2% → FG

末尾のm文字以外、という指定方法
%x:~0,-3% → ABCD

後ろから数えてn文字目から末尾のm文字以外、という指定方法
%x:~-4,-2% → DE

■変数展開時の文字列置換

環境変数は%x:A=B%という書式によって展開時に文字列置換を行える。
ex)変数xの内容がdoudemoexeのとき

eをEに置換
%x:e=E% → doudEmoExE

oをoooに置換(遅延展開)
!x:o=ooo! → doooudemoooexe

■変数の種類と性質

※1:コマンドラインの場合、%は一つになる。

※2:遅延展開を有効にするには、バッチファイル中でsetlocal
enabledelayedexpansionを実行するかcmd.exeを/v:onオプション付きで起動させる。

※3:処理系に依る(?)。

%変数!変数パラメータ変数for変数
使用例%hoge%!hoge!%1%%I(※1)
使用条件なし遅延展開有効時
(※2)
パラメータ指定時forステートメント内
制限8191文字まで(※3)8191文字まで(※3)%0~%9、%*のみ文字の数だけ
展開順序
call後の展開××
修飾子の付加××
部分文字列展開××
文字列置換××