「!」 (変数の遅延使用) - DOS/コマンドプロンプト コマンド一覧
[Windows NT系] [拡張構文] IfやFor・「&」文字による連結など、実行するコマンドが複数存在するコマンドラインの中で環境変数の展開を遅延させるときに使います。環境変数の遅延展開機能が有効になっている必要があります(Setlocalの説明をご覧ください)。
構文
!<value-name>!
構文は「%」の構文と同じで、「%」が「!」に置き換わっただけです。
※ 「!<value-name>!」の形式のみ使用できます。(「!1」などは使用できません。)
解説
IfやForでは、後ろにコマンドラインを指定して特定の条件でコマンドを実行することができますが、コマンドプロンプト(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」を実行してから行われるようになり、意図した動作を得ることができます。
なお、「!」による環境変数の展開は「%」による展開と同じ書式が使えます。書式に関しては「%」のページを、具体例に関してはForをご覧ください。