制御構文風コマンド if

Linuxのシェルには制御構文が存在しており、これを利用することで条件分岐や繰り返し処理を実行できる。Windowsのコマンドプロンプトにはシェルのような制御構文と言い切れるような機能が存在していないが、似たようなことを行うための機能は用意されており、簡単な分岐処理や繰り返し処理を実行できる。

コマンドプロンプトではifというコマンドを使うことで、制御構文のif的な振る舞いをさせることができる。ifコマンドの基本的な使い方は次のとおり。

ifコマンドの基本的な使い方

if [not] errorlevel 番号 コマンド [else 式]
if [not] 文字列1==文字列2 コマンド [else 式]
if [not] exist ファイルパス コマンド [else 式]

コマンドエクステンションが有効になっている場合には次のような使い方もできる。

ifコマンドの基本的な使い方 (コマンドエクステンション有効時)

if [/i] 文字列1 比較演算子 文字列2 コマンド [else 式]
if cmdextversion 番号 コマンド [else 式]
if defined 変数 コマンド [else 式]

ifコマンドに指定するパラメータやその内容は次のとおり。

パラメータ 内容
コマンド 条件が真だった場合に実行するコマンド
not 条件が偽の場合に真とする
errorlevel 番号 直前にcmd.exeによって実行されたコマンドの終了コードが指定した終了コード以上だった場合に真とする
文字列1==文字列2 文字列1と文字列2が同じだった場合に真とする。値はリテラル文字列または%1などのバッチ変数。リテラル文字列は引用符で囲む必要なし
/i 上記文字列比較において指定すると、大文字と小文字を区別しなくなる
exist ファイルパス ファイルが存在した場合に真となる
cmdextversion 番号 cmd.exeのコマンド拡張機能に関連付けられている内部バージョン番号が指定された番号以上だった場合に真となる
defined 変数名 指定された変数が定義されていた場合に真となる
else以降の記述する内容
比較演算子 内容
EQU 等しい
NEQ 等しくない
LSS より小さい
LEQ 同じまたはより小さい
GTR より大きい
GEQ 同じまたはより大きい

コマンドプロンプトのifコマンドはプログラミング言語における分岐構文と捉えるよりも、コマンドとして分岐処理を類似的に提供するものだと考えた方がわかりやすいかもしれない。しかし、( ) でグルーピングすることでほかのプログラミング言語におけるif制御構文のような書き方もできる。Windowsのバッチファイルなどではifをネストするような使い方はあまりしないが、エラー発生時の処理などを書くには不可欠なので、基本的な使い方は把握しておきたい。

ifコマンドの実行サンプル

ifコマンドの実行サンプルを次に示す。次のサンプルはマニュアルにも掲載されているもので、カレントディレクトリにproduct.datというファイルが存在していない場合に「Cannot find data file」というメッセージを出力するというものだ。

ifコマンドの実行サンプル

C:\Users\daich>if not exist product.dat echo Cannot find data file
Cannot find data file

C:\Users\daich>

このサンプルからは、ifコマンドは基本的に1行にまとめて書くこと、existsという指定、notという指定、条件が真だった場合に実行するコマンドの指定方法、などを知ることができる。ifコマンドがどのように動作するかを簡単に知るうえでよいサンプルと言える。

notを抜いたものでも動作を確認しておこう。たとえば次の実行例はカレントディレクトリにDocumentsというディレクトリが存在する場所で、ifコマンドを実行した場合の出力例だ。Documentsというディレクトリが存在しているので、exists Documentsという式は真と評価され、その後のecho Documents existsが実行されている。

ifコマンドの実行サンプル その2

C:\Users\daich>if exist Documents echo Documents exists
Documents exists

C:\Users\daich>

コマンドの実行を( )で囲むようにすると、次のように複数行に分けてifコマンドを書くことができる。こうなってくるとシェルスクリプトやプログラミング言語的のようになってくる。

ifコマンドを複数行に書く方法

C:\Users\daich>if exist Documents (
More?     echo Documents exists
More? ) else (
More?     echo Documents does not exist
More? )
Documents exists

C:\Users\daich>

コマンドプロンプトのifコマンドはそれほど強力なものではないので、あまり複雑なことはできない。ただし、バッチファイルではラベル付きgoto機能が利用できるため、ifとgotoの組み合わせで処理を分岐させることもできる。たとえばマニュアルには次の2つのサンプルコードが掲載されており、ifとgotoの組み合わせでどのようなことができるのかわかるようになっている。

ifとgotoの組み合わせ例 その1

:begin
@echo off
format a: /s
if not errorlevel 1 goto end
echo An error occurred during formatting.
:end
echo End of batch program.

ifとgotoの組み合わせ例 その2

goto answer%errorlevel%
:answer1
echo Program had return code 1
:answer0
echo Program had return code 0
goto end
:end
echo Done!

現在はPowerShellやPowerShell Core、またはさまざまな多機能で便利なプログラミング言語が利用しやすい状況にあることから、バッチファイルを書いて多様な処理を行う必要性は低いといえる。そもそもバッチファイルでは制御構文を使った複雑な実装はやりにくいので、ある程度処理が複雑になってきたらほかの選択肢を選ぶだろう。

しかし、ifコマンドを知っておけば、コマンドプロンプトやバッチファイルでもある程度の分岐処理を行うことができる。Windowsコマンドを活用していくならぜひとも知っておきたい機能だ。

参考資料