117

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

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

私はいつも得る:

ECHO is on.

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

4

2 に答える 2

214

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

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

!を使用するには、追加のステートメントsetlocal EnableDelayedExpansionが必要であることに注意してください。

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
于 2012-02-01T20:12:12.907 に答える
16

私はパーティーに少し遅れていますが、この状態に対処する別の方法は、この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。要するに、スクリプトの設計を再考すれば、そのようにすることができます

于 2018-03-27T21:14:06.920 に答える