IF内でWindowsバッチSETが機能しない


102

このスクリプトを実行しているとき(.batファイルから):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

私はいつも得ます:

ECHO is on.

var2変数が実際に設定されなかったことを意味します。誰かが理由を理解するのを手伝ってくれませんか?

回答:


184

var2が設定されていますecho %var2%が、行が展開される前にブロックが実行されます。
現時点でvar2は空です。

したがって、delayedExpansion構文が存在し、!代わりに使用%され、解析時ではなく実行時に評価されます。

を使用する!には、追加のステートメントsetlocal EnableDelayedExpansionが必要です。

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

11
ありがとうございます。
Myna

&and &&演算子と同じルール。このコードはをset x=some & set y=%x%thing & echo results %y%出力します%x%thing
gwarah

13

私はパーティーに少し遅れますが、この状態に対処する別の方法はif、このように外でプロセスを続けることです

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

または/およびgoto構文を使用

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

この方法では、「時間内に」拡張が行われ、は必要ありませんsetlocal EnableDelayedExpansion。要するに、スクリプトのデザインを考え直せば、そのようにすることができます。


ifステートメント内で作成した変数にアクセスできません。var2を使用した最初の例は機能しません。
AntonioCS

@AntonioCS興味深い...これは、私がテストしたばかりの正確なスクリプトでecho off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pauseあり、機能しています。「プログラム内のどこからでもアクセスできる変数をバッチファイルに作成する場合」aticleworld.com/batch-file-variables-and-scope
TS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.