コマンド内のif文で使用される「!」について
コマンド内のif文で使用される「!」についてご教授ください。
前任者から引き継いだバッチプログラム内の記載で以下のような記載があります。
if !変数! == 0 goto ERR01
変数が0ならERR01へという箇所なのですが
変数を「!」で囲うのはどういう意味になりますでしょうか。
論理否定かと思いましたが。。。
コマンド内のif文で使用される「!」についてご教授ください。
前任者から引き継いだバッチプログラム内の記載で以下のような記載があります。
if !変数! == 0 goto ERR01
変数が0ならERR01へという箇所なのですが
変数を「!」で囲うのはどういう意味になりますでしょうか。
論理否定かと思いましたが。。。
これは Windows のバッチファイルの仕様についての質問であるということでよろしいですね? その前提で回答しますが、質問の際にはどのようなシステムについての質問であるかは明瞭にしておいてください。
バッチファイルでは、変数はそれを読み込んだときに具体的な文字列へ展開されるのが通常の動作ですが !
で囲んである変数についてはそこを通過するときに展開する (処理がそこを通過するまで展開を遅延する) ようになります。
ただし、そのような処理をするときはバッチファイルの冒頭で
setlocal enabledelayedexpansion
というような指示を書いておく必要があります。 cmd /?
としたときのヘルプメッセージでも少し言及されているのですが分かり難いので enabledelayedexpansion
をキーワードとしてウェブ検索すればより詳細な説明を見つけられるでしょう。
前任者に質問したらいいのでは?
@vscarp
Questioner
前任者は退職してすでに不在なので。。。
if "#%var%#"=="#0#" goto ERR01
昔はダミー文字#を用いてvarが空文の時の文法エラーを防いでいました。今は不要です。
さて、
!は%の隠語では? そもそも==は文字列照合です。前任者は文法に興味がなかったのか?逆に詳しすぎたのか?@SaitoAtsushiさんの回答だとすると詳しすぎたのでしょう。
setlocal enabledelayedexpansion
set var=0
if %var% equ 0 goto ERR01
goto END
:ERR01
echo %var%
if !var! equ 0 goto ERR02
endlocal
goto END
:ERR02
echo !var!
:END
chatGPTに歴史的経緯を確認して下さい。できれば、要約して報告してくれると有難いです。
@nak435さんリンク 詳細箇所
p.s. 普通 command /param で間に空白をいれますが、今の人は、空白を入れず、command/param で入力していました。日進月歩と実感してます。
Windowsのバッチファイルの中で使用する変数の参照です。
通常は%%
で囲みますが、ループ内の場合に!!
で囲みます。
その場合は、setlocal enabledelayedexpansion
を指定しておきます。