複数のコマンドをまとめる

何らかの条件の結果で実行するifコマンドの対象コマンドは1つか指定できませんでした。条件によって複数のコマンドを実行対象としたい場合、いくつかのコマンドをまとめて1つのコマンドとする必要があります。このような場合には、複数のコマンドを括弧 ( ) で括ります。

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

例えば、ifコマンドで終了コードを調べ、エラーが発生したときにメッセージを表示すると同時にコマンドプロンプトの色を変更するなど、条件の結果で複数のコマンドを実行することができます。

サンプル 07

@echo off

ReturnCode 1
if %ERRORLEVEL% == 0 echo 正常終了しました
if errorlevel 1 (
    color C0
    echo エラーが発生しました!
)

pause

実行結果

サンプル07の実行結果

サンプル07は、前述した ReturnCode プログラムを使って任意の終了コードを返し、この結果が0以外であればエラーが発生したものとしてコマンドプロンプトの背景色を赤に変更し、同時にエラーが発生したメッセージを出力します。これらのcolorコマンドとechoコマンドを ( ) で括り、ifコマンドの実行対象としています。

else 節

ifコマンドで条件が成立した場合と不成立だった場合のコマンドをそれぞれ実行させるには、2つのif文を次のように用意する方法を思いつくかもしれません。

if A==B コマンド
if not A==B コマンド

多くの場合、上記のようなコマンドでも適切に動作すると思われますが、最初のifコマンドの条件が成立して実行されたコマンドの処理によって環境変数の値が更新され、続く否定形式のifコマンドの条件も成立してしまうという可能性が残ってしまいます。

ある条件が成立しているかどうかによって実行するコマンドを2分岐させるにはelse節を使います。else節を持つifコマンドは次のように記述します。

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

elseは独立したコマンドではないため、ifコマンドの末尾に記述されなければなりません。しかし、ifコマンドの条件によって実行されるコマンドは改行によって終わらなければなりません。そのため、次のelse節を持つifコマンドは不適切です。

if A==B echo AとBは等しい else echo AとBは等しくない

この場合、ifコマンドの条件が成立した場合に実行される最初のechoコマンド以降がechoコマンドのパラメータと解釈されてしまうため、else以降もifコマンドの節としてではなくechoコマンドによって出力される文字列として扱われてしまいます。よって、echoコマンドの末尾に改行を加える必要があります。

if A==B echo AとBは等しい
else echo AとBは等しくない

この場合、改行によってelse節がコマンドとして入力されてしまうため、elseコマンドが存在しないというエラーが表示されてしまいます。else節はifコマンドの一部なので、独立したコマンドとして実行することはできません。そこで、else節を持つifコマンドでは、実行対象のコマンドを前述した ( ) で括ります。

if A==B (echo AとBは等しい) else echo AとBは等しくない

前述したように、複数のコマンドをまとめる場合は ( ) 内でコマンドごとに改行できます。多くの場合、else節を持ったifコマンドは次のように書かれるでしょう。

if A==B (
    コマンド
    コマンド
    ...
) else (
    コマンド
    コマンド
    ...
)

より複雑なバッチ処理では、ifコマンドの結果から、さらに別にifコマンドを実行するなど、ifコマンドを階層化することも可能です。

サンプル 08

@echo off
set /P FILENAME="調べるファイル名>"

if exist %FILENAME% (
    echo 「%FILENAME%」が見つかりました
) else echo 「%FILENAME%」が見つかりません

pause

実行結果

サンプル08の実行結果

サンプル08の実行結果

サンプル08は、サンプル05を解消したもので、入力されたファイル名のファイルが存在するかどうかを調べ、存在しているかどうかによって出力するテキストを分岐させています。ファイルが見つからなかった場合、else節の直後に指定したechoコマンドが実行されます。