コマンドプロンプトの条件判断のif
バッチファイル中で条件判断を行ないたい場合はifを使います。書式は、

if 条件式 実行文1 else 実行文2
となります。条件式が真の場合、実行文1を実行します。条件式が偽の場合、実行文2を実行します。
条件式が偽の場合に何も実行したくなければ、「else 実行文2」は省略可能です。

ファイルの存在を調べるexist
条件式には、ファイルの存在を調べるexistが使用できます。

if exist C:¥a.txt type C:¥a.txt
これはC:¥a.txtが存在する場合、a.txtの中身を表示すると言うバッチファイルです。
「exist C:¥a.txt」までが条件式で、「type C:¥a.txt」までが実行文です。
ファイルが存在しない場合は

if not exist ~
と書きます。
条件式が偽の場合に実行したい実行文がある場合は「if exist C:¥a.txt type C:¥a.txt」のあとに必ず半角スペースを入れて「else 実行文」を書き加えます。条件式が偽の場合にechoコマンドを実行する場合は

if exist C:¥a.txt (type C:¥a.txt) else echo not exist!
というふうに書きます。「type C:¥a.txt」を括弧でくくっているのは、typeコマンドの範囲を決める為です。もし括弧でくくらなかった場合、else以下のelse、echo、not、exist!がtypeコマンドの引数と解釈され、意図した通りにバッチファイルが実行されません。
複数のコマンドを実行したい場合にも括弧を使用します。この場合、コマンドは一行ずつ書かなくてはいけません。

if exist C:¥a.txt (type C:¥a.txt
echo type OK
) else (
echo type NG
)
if~elseを書く上で二つ注意があります。まず一つは以下のように

if exist C:¥a.txt (type C:¥a.txt)
else echo not exist!
ifコマンドの終わりとelseコマンドが違う行になっている場合です。この場合、意図した通りにバッチファイルが実行されません。
ifコマンドの終わり(この場合は「)」がifコマンドの終わりとなる)とelseコマンドは同じ行でなければいけないという点です。

もう一つはif~else文でdelコマンドを使用する場合は必ず括弧で囲むという点です。

if exist C:¥a.txt (del C:¥a.txt) else echo not exist!
delコマンドはその仕様上、改行で終了しなければならないため括弧でくくる必要があります。

ディレクトリの存在を調べるには
ディレクトリの存在を調べる場合もexistを使います。「C:¥dos」ディレクトリの存在を調べたい場合

if exist C:¥dos copy C:¥a.txt C:¥dos¥b.txt
とします。一見正しく見えますがこの場合dosというファイルが存在した場合も条件式が真になってしまいます。「C:¥dos」ディレクトリの存在を調べたい場合

if exist C:¥dos¥nul copy C:¥a.txt C:¥dos¥b.txt
というようにdosディレクトリ配下にnulが存在するかを確認します。nulデバイスはどのディレクトリにも存在するというダミーの入出力デバイスです。nulの性質を利用してディレクトリを調べることにより、dosがディレクトリの場合はnulが存在するので条件式は真となり、dosがファイルの場合はnulが存在しないので条件式は偽となり、正しくディレクトリの存在を調べることが出来ます。

直前のコマンドの終了コードを調べるerrorlevel
条件式には、直前のコマンドの終了コードを調べるerror levelも使用できます。これにより直前のコマンドの実行結果による条件判断が可能になります。

dir | find "a.txt"
if errorlevel 1 (echo not exist!)
これは、dir | find "a.txt"コマンドの終了コードが1以上の場合、not exist!と表示するバッチファイルです。
errorlevelは検索結果が表示された場合は0、検索結果が表示されなかった場合1、引数などの指定方法が間違っていた場合などは2となります。
条件式にはexistと同じようにnotを書くことが出来ます。
バッチファイル上で現在のerrorlevelを調べるには、echo %errorleve%とすると表示されます。

Back to top

Information