質問: if内でバッチファイル内の変数が設定されていませんか。 非常に単純なバッチファイルの例が2つあります。変数に値を代入する:@echo off set foo=1 echo foo: %foo% pause echo on 予想どおり、これは次のようになります。foo: 1 press any key to continue . . . ただし、if not definedブロック内に同じ2行を配置したとします。@echo off if not defined bar ( set foo=1 echo foo: %foo% ) pause echo on これは予期せず結果になります。foo: press any key to continue . . . これはifとは関係ないはずです、明らかにブロックは実行されています。 ifの上にbarを定義すると、予想どおりpauseコマンドのテキストだけが表示されます。何ができる?フォローアップの質問:setlocalを使わずに遅延拡張を有効にする方法はありますか?この単純なサンプルバッチファイルを別の内部から呼び出す場合は、fooが設定されますが、locallyのみが設定されます。例えば:testcaller.bat@call test.bat @echo foo: %foo% @pause test.bat@setlocal enabledelayedexpansion @if not defined bar ( @set foo=1 @echo foo: !foo! ) これは表示します:foo: 1 foo: press any key to continue . . . この場合、callerで遅延拡張を有効にする必要があるように思われますが、これは面倒なことかもしれません。
回答: それでもうまくいかない場合は、環境変数の展開を遅らせた可能性があります。 cmd /v:offで無効にするか、ifの内側に感嘆符を使用することができます。@echo off if not defined bar ( set foo=1 echo foo: !foo! ) pause echo on