コマンドプロンプトで読んでおくべき7つのHELP - その③「if /?」
これは、コマンドプロンプト(cmd.exe) Advent Calendar 2015 - Qiitaの3日目の記事です。
※Windows 10 Home 64bit 搭載のcmd.exeにて検証を行っています。

if /?

  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
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
バッチ プログラム中で条件処理を実行します。

IF [NOT] ERRORLEVEL 番号 コマンド
IF [NOT] 文字列1==文字列2 コマンド
IF [NOT] EXIST ファイル名 コマンド

  NOT               条件が偽の場合にだけ、Windows がコマンドを実行する
                    ことを指定します。

  ERRORLEVEL 番号   最後のプログラムの実行で指定された番号以上の終了コード
                    が返されたときに、条件が真になるように指定します。

  文字列1==文字列2  テキスト文字列が一致するときに条件が真になるように指定
                    します。

  EXIST ファイル名  指定したファイル名が存在するときに条件が真になるように
                    指定します。

  コマンド          条件が真のときに実行するコマンドを指定します。コマンドに
                    続けて、ELSE キーワードの後、指定した条件が偽の場合に
                    実行される ELSE コマンドを指定することができます。

ELSE 節は、IF の後のコマンドと同じ行に置きます。
例:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

del コマンドは、改行で終了しなければならないため、次の例は、正しく動作し
ません:

    IF EXIST filename. del filename. ELSE echo filename. missing

ELSE コマンドは、IF コマンドの終わりと同じ行で始まらなければならないため、
次の例は正しく動作しません:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

次の例のように、すべてのコマンドを 1 行にすれば正しく動作します:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

コマンド拡張機能を有効にすると、IF は次のように変更されます:

    IF [/I] 文字列 1 比較演算子 文字列 2 コマンド
    IF CMDEXTVERSION 番号 コマンド
    IF DEFINED 変数 コマンド

比較演算子は、次のいずれかです:

    EQU - 等しい
    NEQ - 等しくない
    LSS - より小さい
    LEQ - 以下
    GTR - より大きい
    GEQ - 以上

/I スイッチを指定すると、文字列は、大文字と小文字を区別せずに比較され
ます。
/I スイッチは、IF の文字列 1 == 文字列 2 形式で使うこともできます。
この比較は汎用であり、文字列 1 と文字列 2 が両方とも数字だけを含む場合は、
文字列が数値に変換され、数値の比較が行われます。

CMDEXTVERSION 条件は ERRORLEVEL と同様に動作しますが、コマンド拡張機能
に関連付けられている内部バージョン番号との比較を行います。最初の
バージョンは 1 です。
コマンド拡張機能に重要な拡張が追加された場合は、値が 1 大きくなります。
コマンド拡張機能が無効である場合は、CMDEXTVERSION 条件は常に偽です。

DEFINED 条件は EXIST と同様に動作しますが、環境変数名を受け取って、環境
変数が定義されている場合は真を返します。

%ERRORLEVEL% は、ERRORLEVEL の現在の値の文字列表記に展開されます。
ただし、ERRORLEVEL という名前の環境変数が既に定義されている場合は、その
環境変数の値が取得されます。
プログラム実行後、次の例が ERRORLEVEL の使い方を説明しています:

    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

また、上の数値比較を使うこともできます:

    IF %ERRORLEVEL% LEQ 1 goto okay

%CMDCMDLINE% は、CMD.EXE が処理する前の、CMD.EXE に渡されたオリジナル
のコマンド ラインに展開されます。
ただし、CMDCMDLINE という名前の環境変数が既に定義されている場合は、
その環境変数の値が取得されます。

%CMDEXTVERSION% は、CMDEXTVERSION の現在の値の文字列表記に
展開されます。
ただし、CMDEXTVERSION という名前の環境変数が既に定義されている場合は、
その環境変数の値が取得されます。

大事なことしか書いていないので、隅から隅までくまなく読んでください。

注意すべき点

==で判定するとき

==で判定する際に環境変数を使用する場合、注意が必要です。
例えば

1
2
if %A%==HOGE echo fugafuga

などとしてしまうと、仮に環境変数「A」が設定されていないときに展開されると

1
2
if ==HOGE echo fugafuga

となってしまい、構文エラーとなってしまいます。これを避けるために

1
2
if "%A%"=="HOGE" echo fugafuga

などと、ダブルクォートでくくっておくのが無難かなぁと思います。

ELSEの書き方

HELPにも書いてありますが

1
2
3
IF EXIST filename. del filename.
ELSE echo filename. missing

などという書き方はできません。
こんな風に書きましょう。

1
2
3
4
5
6
IF EXIST filename. (
    del filename.
) ELSE (
    echo filename. missing.
)

ちなみに、ELSE IFも書けます。

1
2
3
4
5
6
7
8
IF EXIST filename. (
    echo filename.
) ELSE IF EXIST filename2. (
    echo filename2.
) ELSE (
    echo filename. missing.
)

明日はfor /?です。燃え尽きそう……