Windows batch SET ภายในถ้าไม่ทำงาน


104

เมื่อฉันเรียกใช้สคริปต์นี้ (จากไฟล์. bat):

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

ฉันมักจะได้รับ:

ECHO is on.

ความหมายvar2ไม่ได้ตั้งค่าตัวแปรจริงๆ ใครก็ได้โปรดช่วยฉันเข้าใจว่าทำไม?

คำตอบ:


186

var2 ถูกตั้งค่า แต่การขยายในบรรทัดecho %var2%เกิดขึ้นก่อนที่จะดำเนินการบล็อก
ในเวลาvar2นี้ว่างเปล่า

ดังนั้นไวยากรณ์ delayExpansion จึงมีอยู่โดยจะใช้!แทน%และจะถูกประเมิน ณ เวลาดำเนินการไม่ใช่เวลาแยกวิเคราะห์

โปรดทราบว่าในการใช้งานจำเป็นต้องมี!คำชี้แจงเพิ่มเติมsetlocal EnableDelayedExpansion

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

11
ขอบคุณที่ช่วยให้ฉันเจ็บปวดมาก
Myna

กฎเดียวกันกับ&และ&&ตัวดำเนินการ set x=some & set y=%x%thing & echo results %y%เอาต์พุตรหัส%x%thingนี้
gwarah

14

ฉันไปงานปาร์ตี้ช้าไปหน่อย แต่อีกวิธีหนึ่งในการจัดการกับเงื่อนไขนี้คือดำเนินการต่อไปข้างนอก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.