windows batch SET di dalam JIKA tidak berfungsi


102

ketika saya menjalankan skrip ini (dari file .bat):

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

Saya selalu mendapatkan:

ECHO is on.

Artinya var2variabel tidak benar-benar disetel. Adakah yang bisa membantu saya memahami mengapa?

Jawaban:


184

var2 diset, tetapi ekspansi di baris echo %var2%terjadi sebelum blok dijalankan.
Saat ini var2kosong.

Oleh karena itu sintaks delayExpansion ada, yang digunakan !sebagai ganti dari %dan dievaluasi pada waktu eksekusi, bukan waktu parse.

Harap dicatat bahwa untuk menggunakan !, setlocal EnableDelayedExpansiondiperlukan pernyataan tambahan .

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

11
Terima kasih Anda baru saja menyelamatkan saya dari rasa sakit yang luar biasa.
Myna

Aturan yang sama untuk operator &dan &&. Kode ini set x=some & set y=%x%thing & echo results %y%menghasilkan %x%thing.
gwarah

13

Saya agak telat ke partai tapi cara lain untuk mengatasi kondisi ini adalah melanjutkan proses di luar if, seperti ini

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

Atau / dan gunakan gotosintaks

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

Dengan cara ini ekspansi terjadi "pada waktunya" dan Anda tidak perlu setlocal EnableDelayedExpansion. Intinya, jika Anda memikirkan kembali desain skrip Anda, Anda dapat melakukannya seperti itu


Saya tidak dapat mengakses variabel yang saya buat di dalam pernyataan if. Contoh pertama Anda dengan var2 tidak berfungsi.
AntonioCS

@AntonioCS menarik ... ini adalah skrip yang baru saja saya uji echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. dan berhasil. "jika Anda akan membuat variabel dalam file batch yang dapat diakses di mana saja dalam program." . aticleworld.com/batch-file-variables-and-scope
TS
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.