バッチファイル基礎文法リファレンス

目次

 はじめに

 基礎

 数値

 文字列

 配列

 連想配列

 制御文

 関数

 ファイル入出力

 正規表現

 糖衣構文

 注意

 参考

 付録

改版履歴

2010年 2月11日 初版
2010年 2月13日 遅延環境変数展開を追加
2010年 2月14日 糖衣構文を追加
2010年 3月 2日 特殊な変数展開を追加
2010年 3月11日 文字列の抽出を編集


はじめに

バッチファイルとは

コマンドプロンプトを起動すると、コンソールにプロンプト(C:\>)
が表示され、コマンドの入力を促されます。ユーザーはキーボード
からコマンドを入力することで、いろいろな処理を実行することが
できます。これを「コマンドコンソール機能」と言います。

しかし、決められた処理を実行するために毎回同じコマンドを一つ
一つ入力していくのは面倒です。

そのため、実行するコマンドをあらかじめファイルに書いておき、
そのファイルをコマンドプロンプトに読み込ませて実行させること
ができます。これを「バッチ機能」と言い、実行させるファイルの
ことを「バッチファイル」と言います。

バッチファイルの作成

メモ帳を起動して、コマンド(echo HELLO, WORLD.など)を書きます。
それを「(任意の文字列).bat」か「(任意の文字列).com」という名
前でファイルに保存します。

なお、ファイルの一行目に 「@echo off」という行を追加しておく
と、一行実行される度にその行の内容がコンソールに表示される煩
わしさがなくなります。

バッチファイルの実行

コマンドプロンプトからバッチファイルを実行するには以下のよう
にします。

C:\>X.bat パラメーター

実行する時にパラメーターを必要としなければ、アイコンをダブル
クリックするだけでも構いません。

なお、拡張子を省略して実行することもできます。

C:\>X

省略した場合、環境変数 PATHEXTに登録されている拡張子が順番に
補われて実行されます。

C:\>set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

また、標準入力を利用して実行することもできます。この時、コマ
ンドプロンプトにはバッチファイルの内容が一行ずつ渡されて実行
されます。

C:\>cmd.exe < X.bat

ヘルプ


コマンドの後に「/?」をつけて実行することで、ヘルプを参照する
ことができます。
C:\>cmd /?

目次


基礎

文字列の出力

echoコマンドを利用します。文字列は引用符でくくりません。

echo HELLO, WORLD.

空行を出力するには間をあけずに「 .」(ドット)を指定します。

echo.

特殊な文字を出力するには「 ^」(ハット)でエスケープします。

echo ^|

なお、特殊な文字には以下のものがあります。

& < > [ ] { } ^ = ; ! ' + , ` ~

文字列を複数行にわたって分割して指定するには行末に「 ^」を付
けます。

echo ^
ABCDEFGHIJKLM^
NOPQRSTUVWXYZ

制御文字を出力することもできます。以下は BEL(ベル文字)を入力
する例です。

echo ^G ← CTRL + G

コメント

remコマンドを利用します。コマンド名は REMarks(備考)に由来し
ます。

rem コメント

また、以下のように書くこともできます。これはラベルを利用した
書き方です。

: コメント

見た目をラベルと区別するため、以下のように書くこともあります。

:: コメント

変数

変数には環境変数、バッチ変数、 forコマンドのブロック内だけで
使用される一時変数、位置パラメーターがあります。

環境変数
変数のスコープ(有効範囲)はシステム全体です。どこからでも参照
することができます。

パラメーターを指定せずに setコマンドを実行することで環境変数
の一覧を参照することができます。

C:\>set

バッチ変数
変数のスコープはバッチファイルを実行したコマンドプロンプトの
実行コンテキストに依存します。言い換えれば、バッチファイルの
中であればどこからでも参照することができます。

変数を宣言するには setコマンドを利用します。変数に明確な型は
ありません。なお、「 =」(代入演算子)の前後に半角空白を入れる
ことはできません。

set x=1

変数の値を参照するには変数名を「 %」でくくります。

echo %x%

遅延環境変数展開を利用する場合は、変数名を「 !」でくくります。
遅延環境変数展開については後述します。

echo !x!

変数の宣言を取り消すには以下のようにします。

set x=

なお、setlocalとendlocalコマンドを利用すれば、変数のスコープ
を設定することができます。

setlocal
set i=0
setlocal
echo %i% ← 0
set i=1
echo %i% ← 1
endlocal
echo %i% ← 0
endlocal

一時変数
forコマンドで使用する特殊な変数で、変数のスコープはそのブロ
ック内に限定されます。変数名は「%%英字一文字」で指定し、大文
字と小文字で区別されます。

for /f "tokens=1,2 delims=," %%a in ('echo A,B') do (
echo 一つめの値は %%a です。
echo 二つめの値は %%b です。
)

位置パラメーター
バッチファイルや関数に渡されたパラメーターが格納されています。
位置パラメーターの値は shiftコマンドで参照することができます。

:_
echo %1
shift
if not "%~1" == "" goto _

「 %番号」で参照することもできますが、番号の部分には 1から 9
までの値しか指定することができません。

echo %1 %2 %3 %4 %5 %6 %7 %8 %9

「%*」で渡されたパラメーター全てを参照することができます。

echo %*

なお、パラメーターが引用符付きで渡された場合、「 %」と番号の
間に「 ~」(チルダ)を追加することで、引用符を削除することがで
きます。

「%0」でバッチファイル自体の名前を参照することができます。

echo %0

終了ステータス
バッチファイルは文法に従ってコマンドを並べることで成り立って
います。そのため、コマンドの実行に成功したかどうか確める必要
があります。コマンドの終了ステータスは環境変数ERRORLEVELの値
を参照します。慣習的に値が 0であれば成功、 0以外であれば失敗
です。

dir X.txt
if %ERRORLEVEL% neq 0 (
echo ファイルが見つかりません。
) else (
echo ファイルが見つかりました。
)

なお、バッチファイルで終了ステータスをセットするにはexitコマ
ンドを利用します。パラメーターには32ビット符号付き整数で表現
できる値を指定することができます。

exit /b 数値

遅延環境変数展開
遅延環境変数展開を利用すると、変数が使用された時点で初めて評
価・展開されます。

ifコマンドや forコマンドは一つのブロック(処理単位)として扱わ
れるため、丸カッコの中の変数は最初に展開されます。

以下の例では、変数 tに変数 sの値が代入されることはありません。

setlocal
set s=

if "%s%" == "" (
set s=X
set t=%s%
)

echo %t%
endlocal

しかし、遅延環境変数展開を有効にすると、ifコマンドの中に記述
した行が逐次解釈されて実行されます。

遅延環境変数展開はsetlocalコマンドにenabledelayedexpansionキ
ーワードを指定することで有効になります。

以下の例では、変数 tに変数 sの値が代入されるようになります。

setlocal enabledelayedexpansion
set s=

if "%s%" == "" (
set s=X
set t=!s!
)

echo %t
endlocal

特殊な変数展開
位置パラメーターや一時変数を「%~(英字)」という形式で指定する
ことで、パス文字列からファイルに関連するいろいろな情報を参照
することができます。

指定できる英字には以下のものがあります。

変数を完全なパス文字列に展開
%~f0 → C:\Documents and Settings\xxxxxxxx\デスクトップ\X.bat
変数をドライブレターに展開
%~d0 → C:
変数をドライブレターとファイル名を除くパス文字列に展開
%~p0 → \Documents and Settings\xxxxxxxx\デスクトップ\
変数をファイル名に展開
%~n0 → X
変数を拡張子に展開
%~x0 → .bat
変数を完全なパス文字列( 8.3形式)に展開
%~s0 → C:\DOCUME~1\xxxxxxxx\デスク~1\X.bat
変数をファイルの属性に展開
%~a0 → --a------
変数をファイルの更新日時に展開
%~t0 → 2010/03/01 12:34
変数をファイルのサイズに展開
%~z0 → 1024

また、これらを組み合わせることもできます。例えば、半角空白を
含むパス文字列を含まない形式に変えておくことで、いちいちパス
文字列を引用符でくくる必要がなくなります。

copy %~s0 %~dpsn0.txt

例外処理
ありません。

文法チェック
ありません。

デバッグ
デバッグ用のツールはありませんが、echoコマンドを利用すること
で、変数にセットされている値を部分的に参照することができます。

処理
@echo on
問題のある処理
@echo off
処理

また、実行中の処理を一時停止するには pauseコマンドを入れます。

for /l %%i in (0,1,9) do (
問題のある処理
pause
処理
)

目次 | ← はじめに


数値

数値の表現


32ビット符号付き整数で表現できる値を扱うことができます。

set x=-2147483647
set x=2147483647

以下は文字列としては代入できますが、数値演算に利用することは
できません。

set x=2147483648
set x=0.1

また、 8進数や16進数で指定することもできます。

set x=0xff
set x=0377

以下は値の先頭が 0で始まっているため 8進数と見なされますが、
無効な値なので、数値演算に使用することはできません。

set x=09

なお、 setコマンドに/aを指定して値を代入すると、有効な数値か
どうか確認することができます。

set /a x=09
無効な数字です。数値定数は10進(17桁)、16進(0x11桁)、
または 8進( 021桁)です。

数値演算


setコマンドに/aを指定すると、パラメーターを式として評価させ
ることができます。

set /a x=1+1
set /a x=1-1
set /a x=1*1
set /a x=1/1

剰余(余り)を求める場合は「 %」ではなく「%%」と書きます。

set /a x=3%%2

丸カッコでくくることで演算の優先順位を変えることができます。

set /a x=(1+2)*3

シフト演算もできます。シフト演算子がリダイレクト記号として認
識されないよう、式を引用符でくくります。

set /a x="1<<2"

なお、小数を扱えないので、除算では小数点以下の値を切り捨てた
値が商となります。また、 0で除算することはできません。

set /a x=1/2
set /a x=1/0

インクリメント・ディクリメント


インクリメント・ディクリメント用の書き方はありませんが、代入
演算子の省略記法で代用します。

set /a x+=1
set /a x-=1
set /a x*=1
set /a x/=1

目次 | ← 基礎


文字列

文字列の表現


文字列は引用符でくくる必要はありません。また、値の先頭・末尾
に半角空白がある場合は、文字列の一部と見なされます。

set x=X
set x= X
set x=X X
set x=X ← 半角空白

文字列の結合


set x=X
set x=%x%X

文字列の分割


forコマンドの文字列解析を利用します。tokensに指定した値に応
じて一時変数が暗黙的に追加されますが、事前に分割する数がわか
っていないといけないので、使う機会は限られます。

set x=A,B,C
for /f "tokens=1-3 delims=," %%a in ("%x%") do (
set x[0]=%%a
set x[1]=%%b
set x[2]=%%c
)

または、以下のようにします。

@echo off
setlocal enabledelayedexpansion
set i=0
set t=A,B,C
for %%t in (%t:,= %) do (
set x[!i!]=%%t
set /a i+=1
)
echo %x[0]%
echo %x[1]%
echo %x[2]%
endlocal

文字列の長さ


文字列長を取得するコマンドはありません。そのため、以下のよう
にして求めます。

@echo off
setlocal
set i=0
set t=%~1
if "%t%" == "" exit /b 0
:_
set t=%t:~1%
set /a i+=1
if not "%t%" == "" goto _
exit /b %i%
endlocal

文字列の抽出


指定した範囲の文字列を抽出します。文字列の先頭は 1ではなく 0
です。

set x=1234567890
:: 文字列の先頭から数えて 3文字目から最後までの文字列を抽出
echo %x:~3% ← 4567890
:: 文字列の末尾から数えて m文字目から最後までの文字列を抽出
echo %x:~-3% ← 890
:: 文字列の先頭から数えて m文字目から最後までの文字列を抽出
:: し、その文字列の先頭から数えて n文字を抽出
echo %x:~3,2% ← 45
:: 文字列の末尾から数えて m文字目から最後までの文字列を抽出
:: し、その文字列の先頭から指定した n文字を抽出
echo %x:~-3,2% ← 89
:: 文字列の先頭から数えて m文字目から最後までの文字列を抽出
:: し、その文字列の末尾から指定した n文字を削除
echo %x:~3,-2% ← 45678
:: 文字列の末尾から数えて m文字目から最後までの文字列を抽出
:: し、その文字列の末尾から指定した n文字を削除
echo %x:~-3,-2% ← 8

文字列の検索


文字列を検索して見つかった位置を求めるコマンドはありませんが、
findstrコマンドを利用することで指定した文字列が含まれている
か確かめることができます。

(echo あいうえお) | findstr /l "う" > NUL
if %ERRORLEVEL% equ 0 (
echo 文字列が見つかりました。
) else (
echo 文字列が見つかりません。
)

文字列の置換


指定した文字列に置換します。

set x=xxxxxxxx
set x=%x:x=X%

目次 | ← 数値


配列

変数の宣言と代入


配列はありませんが、変数によって配列を擬似的に表現することが
できます。

一次元配列
@echo off
setlocal enabledelayedexpansion
for /l %%i in (0,1,9) do (
set x[%%i]=%i
)
for /l %%i in (0,1,9) do (
echo !x[%%i]!
)
endlocal

二次元配列
@echo off
setlocal enabledelayedexpansion
for /l %%i in (0,1,9) do (
for /l %%j in (0,1,9) do (
set /a x[%%i][%%j]=%%i*%%j
)
)
for /l %%i in (0,1,9) do (
for /l %%j in (0,1,9) do (
echo !x[%%i][%%j]!
)
)
endlocal

要素の参照


要素の値を参照します。

echo %x[0]%

要素の個数


要素の個数を求めるには setコマンドを利用します。

echo %x[0]%
for /f "" %%i in ('set x ^| findstr /r x\[.*\]') do (
set /a i+=1
)
echo %i%

目次 | ← 文字列


連想配列

変数の宣言と代入


連想配列はありませんが、変数によって連想配列を擬似的に表現す
ることができます。

for %k in (A B C) do (
set x["%k"]=%k
)

要素の参照


要素の値を参照します。

echo %x["A"]%

要素の個数


要素の個数を求めるには setコマンドを利用します。

for /f "" %%i in ('set x ^| findstr /r x\[.*\]') do (
set /a i+=1
)
echo %i%

目次 | ← 配列


制御文

条件分岐


条件判断によって処理を分岐します。ifコマンドは一つのブロック
として扱われるので、丸カッコの中で変数を使用した場合、すべて
の変数が展開されてから処理が実行されます。丸カッコの中で変数
の値を変更する時は遅延環境変数展開という機能を利用する必要が
あります。

if 条件 (
コマンド
)

if 条件 (
コマンド
) else (
コマンド
)

否定
if not 条件 (
コマンド
)

数値の比較
比較演算子は以下の 6種類が利用できます。

equ (EQUal) → ==
neq (Not EQual) → !=
lss (LeSS than) → <
leq (Less EQual) → <=
gtr (GreaTeR than) → >
geq (Greater EQual) → >=

set x=0
if %x% equ 0 (
echo 変数 xの値は 0です。
)

文字列の比較
文字列を引用符でくくる必要はありませんが、半角空白を含む文字
列や空文字の場合は必要です。しかし、文字列に引用符が含まれる
場合は意図したとおりに動作しません。

set x=A
if "%x%" == "A" (
echo 変数 xの値は Aです。
)

ifコマンドに/iを指定すると、大文字と小文字を区別せずに比較し
ます。

set x=a
if /i "%x%" == "A" (
echo 変数 xの値は Aです。
)

終了ステータスの確認
終了ステータスの確認には二つの書き方があります。

前者はキーワードですが、後者は環境変数なので変数展開した上で
数値として比較します。

if errorlevel 0 (
コマンド
)

if %ERRORLEVEL% equ 0 (
コマンド
)

ファイル存在の確認
文字列を引用符でくくる必要はありませんが、文字列に半角空白が
含まれる場合は必要です。

if exist "パス文字列" (
echo ファイルが見つかりました。
) else (
echo ファイルが見つかりません。
)

ファイル存在の確認
文字列を引用符でくくる必要はありませんが、文字列に半角空白が
含まれる場合は必要です。

if exist "パス文字列" (
echo ファイルが見つかりました。
) else (
echo ファイルが見つかりません。
)

変数宣言の確認
すでに変数が宣言されているか確認することができます。変数名は
引用符でくくりません。くくると引用符も変数名の一部と見なされ
ます。

if defined 変数名 (
echo 変数は宣言されています。
) else (
echo 変数は宣言されていません。
)

無条件分岐

gotoコマンドを利用して指定したラベルへ移動することができます。
ifコマンドと組み合わせて使用したり、関数から呼び出し先に戻る
時に使用します。gotoコマンドの後に指定するラベル名には「 :」
(コロン)を付ける必要はありません。

コマンド
if %ERRORLEVEL% equ 1 goto ラベル (1)
if %ERRORLEVEL% equ 2 goto ラベル (2)
exit

:ラベル (1)
コマンド
exit

:ラベル (2)
コマンド
exit

なお、ファイルの終端を意味する「:EOF」( End Of File)という特
殊なラベルがあります。これについては関数の説明を参照してくだ
さい。

繰り返し(ループ)

同じ処理を繰り返し実行します。繰り返しにはラベルを利用した書
き方と forコマンドを利用した書き方の二つがあります。

:ラベル名
コマンド
if 条件 goto ラベル名

for 変数 in (条件) do (
コマンド

forコマンドには多くの機能が実装されています。よく使われるの
は一般的なループ(/l)と値を列挙するループですが、他にも文字列
操作(/f)や複数のフォルダー間を移動しながら再帰的に処理を実行
する(/r)など、いろいろな用途に利用することができます。

一般的なループ
for /l %%i in (0,1,9) do (
echo %%i
)

for /l %%i in (9,-1,0) do (
echo %%i
)

値を列挙するループ
半角空白を区切り文字として一時変数に一つずつ値を代入します。
銃弾が一発ずつ射出されるようなイメージです。
set x=X Y Z
for %%i in (%x%) do (
echo %%i
)

文字列操作
文字列操作の説明を参照してください。

ファイルから一行ずつ読み込む
@echo off
(
(echo A B C D E F G H I J K L M) ^
& (echo N O P Q R S T U V W X Y Z)
) > X.txt
for /f "tokens=*" %%i in (X.txt) do (
echo %%i
)
del X.txt

フォルダーを移動しながら処理を実行
for /r %%i in (.) do (
echo %%i
)

無限ループ
:_
コマンド
goto _

for /l %%i in (0,0,0) do (
コマンド
)

推奨できませんが、無限ループを利用して以下のように書くことも
できます。

for /l %%i in (0,0,0) do (
コマンド && goto BREAK
ping -n 3 127.0.0.1 > NUL
)
:BREAK

目次 | ← 連想配列


関数

サブルーチンと関数


関数はありませんが、サブルーチンとcallコマンドを利用すること
で関数を擬似的に表現することができます。

gotoコマンドは指定されたラベルに移動するだけですが、callコマ
ンドは別のコンテキストで処理が実行されるため、引数を渡したり、
終了ステータスを返すことができます。

callコマンドを利用したサブルーチンは、gotoコマンドを利用した
ものよりもより関数に近い機能を持つので、ここではあえて関数と
呼ぶことにします。

関数の定義


関数を定義するにはラベルとsetlocal・endlocalコマンドを組み合
わせて利用します。setlocal・endlocalコマンドで変数のスコープ
を設定し、「:EOF」( End Of File)という特殊なラベルを利用する
ことで関数の呼び出し先に戻ります。

:ラベル名
setlocal
処理
endlocal
goto :EOF

関数の呼び出し


callコマンドを利用して呼び出します。

call :ラベル名

または、処理を別のファイルに書いておき、それを呼び出すことも
できます。

call ファイル名

関数に引数を渡すにはラベルの後に指定します。

call :ラベル名 引数

引数は半角空白や「 ,」(カンマ)、「 ;」(セミコロン)で区切って
複数渡すことができます。

call :ラベル名 引数 (1) 引数 (2)
call :ラベル名 引数 (1),引数 (2)
call :ラベル名 引数 (1);引数 (2)

引数の参照


引数は「 %番号」で参照することができます。引数が引用符付きで
渡された場合、「 %」と番号の間に「 ~」(チルダ)を追加すること
で、引用符を削除することができます。半角空白を含む文字列や空
文字列を渡す時に利用します。

@echo off
setlocal
call :X "X"
endlocal
goto :EOF

:X
setlocal
echo %1
echo %~1
endlocal
goto :EOF

戻り値の返却


終了ステータス
終了ステータスを返すにはexitコマンドを利用します。

@echo off
setlocal
call :X "X"
echo %ERRORLEVEL%
endlocal
goto :EOF

:X
setlocal
if not defined %~1 (
exit /b 1
) else (
exit /b 0
)
endlocal
goto :EOF

数値・文字列
戻り値を呼び出し先に返すこともできますが、少し特殊な書き方に
なります。引数に「戻り値をセットする変数名」を渡し、endlocal
コマンドの後に「 &」(アンパサンド)を書きます。最後に変数名を
利用して値をセットします。

@echo off
setlocal
call :X "X" x
endlocal
goto :EOF

:X
setlocal
set s=%~1
set s=%~1X
endlocal & set %2=%s%
goto :EOF

これはendlocalコマンドの行を実行する際、まず最初に変数展開が
行われる性質を利用しています。これにより、setlocal・endlocal
コマンドで設定したスコープの外であっても、関数内で処理した値
を関数外に渡すことができます。

目次 | ← 制御文


ファイル入出力

標準出力


コマンドが出力するメッセージをファイルとして保存したい場合は
「 >」(リダイレクト演算子)を利用します。

コマンド > ファイル名

コマンド実行時にそのコマンドが標準出力にメッセージを出力して
いれば、指定したファイルにメッセージが書き込まれます。

ファイルにメッセージを追記するにはリダイレクト演算子を重ねて
指定します。

コマンド >> ファイル名

標準エラー出力


コマンド実行時にエラーが発生した場合、そのコマンドが標準エラ
ー出力にメッセージを出力していれば、指定したファイルにメッセ
ージが書き込まれます。

コマンド 2> ファイル名

また、メッセージが標準出力と標準エラー出力に出力されている場
合、両方を同じファイルに出力することもできます。

コマンド > ファイル名 2> ファイル名

または、

コマンド > ファイル名 2>&1

「&1」は標準出力の出力先を意味します。標準エラー出力のデフォ
ルトの出力先はコンソールですが、上の例ではこれを標準出力と同
じ出力先に変更しています。標準出力の出力先にはファイルが指定
されているので、標準エラー出力の出力先もファイルとなります。

標準入力


標準入力を通じてファイルの内容を一行ずつ読み込み、コマンドに
渡します。ただし、コマンドが標準入力からの入力に対応している
場合に限ります。

コマンド < ファイル名

これにより、コマンドの実行結果をファイルに出力しておき、それ
を標準入力を通じて別のコマンドで読み込んで処理するということ
もできます。

しかしいちいちファイルを作成しなくても、「 |」(パイプ演算子)
を利用すれば、あるコマンドが標準出力に出力するメッセージを別
のコマンドの標準入力に直接渡すことができます。

コマンド (1) | コマンド (2)

目次 | ← 関数


正規表現

(タイトル)


(文章)

(ソースコード)

目次 | ← ファイル入出力


糖衣構文

複数のコマンドを一行にまとめて書いたり、可読性を上げるために
使用します。

()
「()」(グループ演算子)でくくることで、複数のコマンドをまとめ
ることができます。

(echo 12345) > X.txt
(echo 67890) >> X.txt

(
echo 12345
echo 67890
) > X.txt

ただし、別のコンテキストで実行されることがあるため、丸カッコ
の中で変数に値を代入しても、その外からは変更された値を参照で
きない場合があります。

C:\>(set x=1) & echo %x%

&&
「&&」の前のコマンドの終了ステータスが 0の場合、後のコマンド
を実行します。

コマンド (1)
if %ERRORLEVEL% equ 0 (
コマンド (2)
)

コマンド (1) && コマンド (2)

||
「||」の前のコマンドの終了ステータスが 0以外の場合、後のコマ
ンドを実行します。

コマンド (1)
if %ERRORLEVEL% neq 0 (
コマンド (2)
)

コマンド (1) || コマンド (2)

また、「&&」と組み合わせて、条件分岐を以下のように書くことも
できます。

コマンド
if %ERRORLEVEL% equ 0 (
コマンド (1)
) else (
コマンド (2)
)

コマンド && (コマンド (1)) || (コマンド (2))

&
「 &」の前のコマンドを実行した後、後のコマンドを実行します。
「&&」と異なり、前のコマンドの終了ステータスに左右されません。

コマンド (1)
コマンド (2)

コマンド (1) & コマンド (2)

ifコマンド
if 条件 (
コマンド
)

if 条件 (コマンド)

または、

if 条件 (
コマンド (1)
) else (
コマンド (2)
)

if 条件 (コマンド (1)) else (コマンド (2))

丸カッコの中で実行するコマンドが一つしかなければ、丸カッコを
省略することもできます。

if 条件 コマンド

forコマンド
ifコマンドと同様に省略することができます。

for 変数 in (条件) do (
コマンド
)

for 変数 in (条件) do (コマンド)
for 変数 in (条件) do コマンド

setコマンド
数値の代入のみ、「 ,」(カンマ演算子)で区切って宣言することが
できます。

set /a 変数 (1)=値 (1)
set /a 変数 (2)=値 (2)

set /a 変数 (1)=値 (1),変数 (2)=値 (2)

目次 | ← 正規表現


注意

コマンドプロンプトは Windowsのバージョンアップとともに機能が
拡張されてきました。そのため、最新バージョンの Windowsで動作
するものが古いバージョンの Windowsでも動作するとは限りません。
移植性は高くないので注意してください。

バッチファイルは C言語のようなコンパイル済みのバイナリファイ
ルと比べ、実行速度は遅いです。また、 Windows以外のシステムで
は使用できないため、可搬性もありません。

バッチファイルの実行を一時停止してファイルを修正・保存した場
合、一時停止を解除した後の挙動は不定です。

ifコマンドや forコマンドの丸カッコの中で複雑な処理を行おうと
すると、意図したとおりに動作しないことがあります。

以下のバッチファイルを作成して実行すると、

call %0

スタックの 90%を使用した時点で処理が中断されます。

****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******

callコマンドを利用しない場合は無限ループになります。

%0

目次 | ← 糖衣構文


参考

天野司 『Windows XP/2000コマンドプロンプト ポケットリファレンス』 (技術評論社, 2003年)

コマンドシェルの概要
http://technet.microsoft.com/ja-jp/library/cc737438(WS.10).aspx

Windows 2000コマンドライン徹底活用
http://www.atmarkit.co.jp/fwin2k/operation/command001/command1.html

Batch Function Library for Windows
http://www.commandline.co.uk/lib/treeview/index.php

それはそれ。これはこれ。
http://d.hatena.ne.jp/otn/

目次 | ← 注意


付録

サンプル


カレンダーを表示するバッチファイルです。 cal.batという名前で
ファイルを保存し、コマンドプロンプトから以下のように実行して
ください。

C:\>cal 2 2010
2010/ 2
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

@echo off
setlocal enabledelayedexpansion
set d= 030101001010
set n=0
set t=
set w=0

(echo %1%2) | findstr /r "[^0-9]." > NUL
if %ERRORLEVEL% equ 0 (
echo Usage: %~n0 MONTH YEAR
exit /b 1
)

if %1 lss 1 (
echo %~n0: illegal month value: use 1-12
exit /b 1
)
if %1 gtr 12 (
echo %~n0: illegal month value: use 1-12
exit /b 1
)

if %2 lss 1 (
echo %~n0: illegal year value: use 1-9999
exit /b 1
)
if %2 gtr 9999 (
echo %~n0: illegal year value: use 1-9999
exit /b 1
)

:: 指定された日の曜日を取得
call :Z %2 %1 1 w

:: 指定された月の日数を取得
set /a d=31-!d:~%1,1!
if %1 equ 2 (call :is_leap_year %2 || set /a d+=1)

:: カレンダーを表示
if %1 lss 10 (
echo %2/ %1
) else (
echo %2/%1
)
echo Su Mo Tu We Th Fr Sa
for /l %%i in (1,1,%w%) do (set t=!t! )
for /l %%d in (1,1,%d%) do (
if %%d lss 10 (set t=!t! )
set t=!t!%%d
call :Z %2 %1 %%d n
if !n! equ 6 (echo !t! & set t=) else (set t=!t! )
)
if not "%t%" == "" echo %t%
echo.
endlocal
goto :EOF

:is_leap_year
setlocal
set n=0

set /a n=%1%%400
if %n% equ 0 exit /b 1

set /a n=%1%%100
if %n% equ 0 exit /b 0

set /a n=%1%%4
if %n% equ 0 exit /b 1

exit /b 0
endlocal
goto :EOF

:: ツェラーの公式
:Z
setlocal
set y=%1
set m=%2
set w=0

if %m% leq 2 (
set /a y-=1
set /a m+=12
)

set /a w=(5*%y%/4-%y%/100+%y%/400+(26*%m%+16)/10+%3)%%7
endlocal & set %4=%w%
goto :EOF

組み込みコマンド


コマンドプロンプト( cmd.exe)自体に組み込まれたコマンドです。

assoc dir mkdir rename verify
break echo move rmdir vol
call endlocal path set
cd erase pause setlocal
chdir exit popd shift
cls for prompt start
color ftype pushd time
copy goto rd title
date if rem type
del md ren ver

目次 | ← 参考

inserted by FC2 system