Windows toplu çalışmıyorsa içinde SET


103

Bu komut dosyasını çalıştırdığımda (bir .bat dosyasından):

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

Ben her zaman şunu elde ederim:

ECHO is on.

Anlamı var2değişkeni gerçekten ayarlanmamış. Lütfen biri nedenini anlamama yardım edebilir mi?

Yanıtlar:


185

var2 ayarlanmıştır, ancak satırdaki genişletme echo %var2%, blok yürütülmeden önce gerçekleşir.
Şu anda var2boş.

Bu nedenle, delayedExpansion sözdizimi vardır, !yerine kullanır %ve ayrıştırma zamanında değil yürütme zamanında değerlendirilir.

Kullanmak !için ek beyanın setlocal EnableDelayedExpansiongerekli olduğunu lütfen unutmayın .

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

11
Teşekkürler, az önce beni büyük bir acıdan kurtardın.
Myna

Aynı kural &ve &&operatörler için. Bu kod set x=some & set y=%x%thing & echo results %y%çıktılar %x%thing.
gwarah

13

Partiye biraz geç kaldım ama bu durumla başa çıkmanın bir başka yolu da işleme dışarıda devam etmek if, bunun gibi

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

Veya / ve gotosözdizimi kullan

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

Bu şekilde genişleme "zamanında" gerçekleşir ve ihtiyacınız yoktur setlocal EnableDelayedExpansion. Sonuç olarak, senaryonuzun tasarımını yeniden düşünürseniz, bunu şu şekilde yapabilirsiniz.


Bir if ifadesinin içinde oluşturduğum bir değişkene erişemiyorum. Var2 ile ilk örneğiniz çalışmıyor.
AntonioCS

@AntonioCS ilginç ... Bu test ettiğim tam komut dosyası echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. ve çalışıyor. "toplu iş dosyasında programın herhangi bir yerinden erişilebilecek bir değişken oluşturacaksanız." . aticleworld.com/batch-file-variables-and-scope
TS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.