Programming Field

! (感嘆符) - DOS コマンド一覧

スポンサーリンク

[Windows NT系] [拡張構文] IfForなど、実行するコマンドが複数存在するコマンドラインの中で環境変数の展開を遅延させるときに使います。環境変数の遅延展開機能が有効になっている必要があります(Setlocalの説明をご覧ください)。

構文

!<value-name>!

構文は「%」の構文と同じで、「%」が「!」に置き換わっただけです。

解説

IfForでは、後ろにコマンドラインを指定して特定の条件でコマンドを実行することができますが、コマンドプロンプト(cmd.exe)は環境変数の展開をコマンドライン全体が渡されたときに行うため、IfやForに指定したコマンドラインの中に環境変数が存在すると、実際にコマンドを実行する前に環境変数が展開されてしまいます。具体的には以下の例をご覧ください。

if "%VAR%"=="" (
    call hoge.bat
    if "%VAR%"=="" (
        echo Failed.
        exit /B 1
    )
)
...

この例では、環境変数「VAR」が空文字列(あるいは未設定)の場合は「hoge.bat」を実行し、それでも「VAR」が設定されていない場合は「Failed.」を出力して終了することを意図して書かれたコマンドです。ところが、コマンドプロンプトは環境変数の展開を先に行ってしまうため、もし「VAR」が未設定の場合は

if ""=="" (
    call hoge.bat
    if ""=="" (
        echo Failed.
        exit /B 1
    )
)
...

と展開され、「hoge.bat」が「VAR」を設定しても「Failed.」を出力して終了してしまいます。そこで、

if "%VAR%"=="" (
    call hoge.bat
    if "!VAR!"=="" (
        echo Failed.
        exit /B 1
    )
)
...

と記述することで、3行目の「If」における環境変数の展開が「hoge.bat」を実行してから行われるようになり、意図した動作を得ることができます。

なお、「!」による環境変数の展開は「%」による展開と同じ書式が使えます。書式に関してはSetを、具体例に関してはForをご覧ください。