@vscarp

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

コマンド内のif文で使用される「!」について

コマンド内のif文で使用される「!」についてご教授ください。

前任者から引き継いだバッチプログラム内の記載で以下のような記載があります。

if !変数! == 0 goto ERR01

変数が0ならERR01へという箇所なのですが
変数を「!」で囲うのはどういう意味になりますでしょうか。
論理否定かと思いましたが。。。

0 likes

4Answer

これは Windows のバッチファイルの仕様についての質問であるということでよろしいですね? その前提で回答しますが、質問の際にはどのようなシステムについての質問であるかは明瞭にしておいてください。

バッチファイルでは、変数はそれを読み込んだときに具体的な文字列へ展開されるのが通常の動作ですが ! で囲んである変数についてはそこを通過するときに展開する (処理がそこを通過するまで展開を遅延する) ようになります。

ただし、そのような処理をするときはバッチファイルの冒頭で

setlocal enabledelayedexpansion

というような指示を書いておく必要があります。 cmd /? としたときのヘルプメッセージでも少し言及されているのですが分かり難いので enabledelayedexpansion をキーワードとしてウェブ検索すればより詳細な説明を見つけられるでしょう。

2Like

Comments

  1. @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 で入力していました。日進月歩と実感してます。

0Like

Windowsのバッチファイルの中で使用する変数の参照です。
通常は%%で囲みますが、ループ内の場合に!!で囲みます。
その場合は、setlocal enabledelayedexpansionを指定しておきます。

0Like

Your answer might help someone💌