MS-DOS コマンドプロンプトとバッチファイルに関するTips。 ここで紹介するものは主にWindows XP, Windows 7にて検証したもの(他のOSでは未検証)。
環境変数
- 値を代入するときは、「set 変数名=値」
- 値を参照するときは、「%変数名%」
- 値の一部分を取得するときは、「%変数:~開始位置,長さ%」
echo
echoの使い方。
echo on/off
echo on(デフォルト)の場合は、バッチファイルのコマンドがそのまま表示される。 echo offの場合は、コマンドは表示されず、結果のみが表示される。
echo offにすると、バッチファイルで実行するコマンドの部分が表示されなくなる。
さらに、「@echo off」とすると、「echo off」を実行するときのコマンドも表示されなくなる。
メッセージを表示する
echoに続く文字列はそのまま表示される。 環境変数は値が展開されて表示される。 「echo.」とすると空行が表示される。
set
setの使い方。
すべての環境変数を表示する
setコマンドをオプション無しで実行すると、現在定義されているすべての環境変数が表示される。
環境変数を設定する
キーボードからの入力を環境変数に代入する
/pオプションを指定してsetコマンドを実行すると、キーボードからの入力を環境変数に代入することが出来る。
また、次の例のようにプロンプト文字列を指定することも出来る。
四則演算等の演算を行う
/aオプションを指定してsetコマンドを実行すると、四則演算等の演算を行うことが出来る。
+=演算子や-=演算子などの複合代入演算も行うことが出来る。 なお、インクリメント・デクリメント演算子は無いので、代わりに += もしくは -= を使う必要がある。
文字列操作
連結
2つの変数を並べることで、文字列の連結を行うことが出来る(連結するための結合演算子は無い)。
部分文字列の取得
「%変数:~開始位置,長さ%」とすることで変数の内容から部分文字列を取得できる。 長さを省略したり、負の値を指定することも出来る。 開始位置に負の値を指定すると末尾n文字目からの部分文字列、長さに負の値を指定すると末尾n文字目までの部分文字列を取得出来る。 なお文字の番号は0から始まるため、先頭の文字は0番目となる。
書式と得られる結果をまとめると次のようになる。
書式 | 得られる部分文字列 (下線部分) |
---|---|
%STR:~0% | 0123456789 |
%STR:~0,3% | 0123456789 |
%STR:~3% | 0123456789 |
%STR:~3,5% | 0123456789 |
%STR:~3,-5% | 0123456789 |
%STR:~-5% | 0123456789 |
%STR:~-5,2% | 0123456789 |
%STR:~-5,-2% | 0123456789 |
置換
「%変数:置換前の文字列=置換後の文字列%」とすることで変数の一部分を置換した結果を得ることが出来る。 最初に一致した箇所でなく、一致する箇所全てが置換される。 置換後の文字列を省略すると空の文字列に置換されることとなり、部分文字列を削除することが出来る。
キー入力があるまで処理を中断する
pauseを用いると、その部分で処理を中断し、キー入力があるまで待機する。
年月日を変数に代入する
システム変数%DATE%で取得できる日付の文字列を切り出して、年月日をそれぞれ別々の変数に代入する。
「%変数:~開始位置,長さ%」で変数の一部分を切り出すことが出来る。 システム変数%DATE%の書式は「yyyy/mm/dd」になっているので、それぞれ一部分を切り出して別々の変数に代入することで年月日を取得できる。
時刻についても同様に取得できる。
コメント
REMを使えばバッチファイル中にコメントを記述できるが、行頭にREMが並ぶのは見づらい。
REMの代わりに、GOTOで使用するラベルを定義するために用いるコロン(:)を応用することで、コロン(:)で始まる行をコメント行にすることができる。
コロン(:)の後ろに続く文字列がラベルとして使用されない限りは意味のない行となるため、コロン(:)で始まっていればその後ろに続く文字は何でもOK。 下記のいずれの表記も文法上エラーとはならず、また意味のない行となるため、コメント行となる。
乱数を取得する
システム変数%RANDOM%
を参照すると0から32767までの乱数を取得できる。
終了コードを取得する
システム変数%ERRORLEVEL%
を参照すると直前に実行したコマンドの終了コードを取得できる。
ファイルの有無で処理を分岐する
if exist文を用いるとファイルが存在する場合の処理を記述できる。 さらにgoto文と組み合わせることで、ファイルが存在する場合とそうでない場合で処理を分岐させることが出来る。
if not exist文を用いると、ファイルが存在しない場合の処理を記述できる。
引数
%番号
とするとバッチファイルに渡されたコマンドライン引数を取得することができる。 例えば%1
には1番目、%2
には2番目に指定された引数が格納される。 引数に与えられたダブルクオーテーション"
などはそのまま取得される。 %0
にはバッチファイル自体のパス(実行時のパス)が格納される。
引数の展開と修飾子
%~(番号)
のように引数番号の前に~
を記述すると、引数を展開する際にダブルクオーテーション"
が削除される。
さらに、%~f1
のように%~(修飾子)(番号)
と記述すると、修飾子によって展開される結果が次のように変わる。 修飾子を指定した場合も同様にダブルクオーテーション"
が削除される。
修飾子 | 展開時の動作 |
---|---|
f
|
引数をフルパス名に展開する |
p
|
引数からファイル名を除いたディレクトリ部分に展開する |
n
|
引数から拡張子を除いたファイル名に展開する |
x
|
引数を拡張子だけに展開する |
d
|
引数をドライブレターと: だけ(C: など)に展開する |
t
|
引数をファイルの日時に展開する |
z
|
引数をファイルのサイズに展開する |
なお、これらの修飾子は組み合わせて複数指定することもできる。 そのため、次のように展開時にファイル名や拡張子を別のものに置き換えることもできる。
他のバッチファイルを呼び出す
callコマンドを用いると、他のバッチファイルを呼び出すことができる。 このとき、引数を指定することもできる。
環境変数は展開されてから引数として渡されるので、値に空白が含まれていると引数の区切りとみなされ、別々に渡される点に注意が必要。 環境変数に空白が含まれる場合はダブルクオーテーション"
でくくることによりひとつの引数として渡すことができる。 また、callコマンドによって呼び出されたバッチファイルも同一プロセスで実行されるため、呼び先のバッチファイルから呼び元の環境変数を参照することができる。
パイプとリダイレクト
パイプ
コマンド1の標準出力をコマンド2の標準入力に接続するには次のようにする。
次の例では、typeコマンドによってファイルの内容を標準出力に書き出し、sortコマンドの標準入力に渡すことでsource.txtの内容をソートした状態で表示している。
次のように複数のコマンドを連結することができる。
リダイレクト
標準入力
ファイルfileの内容をコマンドcommandの標準入力に渡すには次のようにする。
標準出力
コマンドcommandが標準出力に出力する内容をファイルfileに書き込むには次のようにする。
STDOUTのハンドルを表す1は省略することができるので、1>
は単に>
と記述することができる。
標準エラー
コマンドcommandが標準エラーに出力する内容をファイルfileに書き込むには次のようにする。
標準出力の場合とは異なり、STDERRのハンドルを表す2は省略することができないので、2>
を単に>
と記述することはできない。
標準出力・標準エラーの追記書き込み
標準出力・標準エラーをリダイレクトする場合、>>
や2>>
と記述することでリダイレクトの際に書き込まれる内容を上書きではなくファイルに追記させることができる。
標準入力と標準出力のリダイレクト
ファイルinput.txtの内容をコマンドの標準入力に渡し、コマンドの標準出力をファイルoutput.txtにリダイレクトする場合は次のようにする。
標準出力と標準エラーのリダイレクト
標準出力と標準エラーを別々のファイルにリダイレクトする場合は次のようにする。
標準出力と標準エラーを同一のファイルにリダイレクトする場合は次のようにする。
これは次のようにすることもできる。
NULデバイス
UNIXの/dev/null
に相当するものとしてnul
が用意されている。 例えば標準出力をnul
にリダイレクトすれば出力内容はすべて破棄され、一切表示されなくなる。
文字コードの変更
chcpコマンドを用いると、使用する文字コードを変更できる。 引数で指定できる主な文字コードは次のとおり。
コード | 名称 |
---|---|
932 | Shift-JIS (デフォルト) |
20932 | EUC-JP (IS X 0208-1990 and JIS X 0212-1990) |
51932 | EUC-JP |
65000 | UTF-7 |
65001 | UTF-8 |
引数を指定せずにchcpコマンドを実行すると、現在の文字コードが表示される。
なお、chcpコマンドで文字コードを変更すると、ウィンドウのサイズとフォントが代わり漢字等が正しく表示されなくなるので、次の手順であらかじめフォントを変更しておく必要がある。
- コマンドプロンプトのプロパティを開く
- 「フォント」タブで「MSゴシック」等のフォントに変更する