เมื่อฉันเรียกใช้สคริปต์นี้ (จากไฟล์. bat):
set var1=true
if "%var1%"=="true" (
set var2=myvalue
echo %var2%
)
ฉันมักจะได้รับ:
ECHO is on.
ความหมายvar2
ไม่ได้ตั้งค่าตัวแปรจริงๆ ใครก็ได้โปรดช่วยฉันเข้าใจว่าทำไม?
เมื่อฉันเรียกใช้สคริปต์นี้ (จากไฟล์. bat):
set var1=true
if "%var1%"=="true" (
set var2=myvalue
echo %var2%
)
ฉันมักจะได้รับ:
ECHO is on.
ความหมายvar2
ไม่ได้ตั้งค่าตัวแปรจริงๆ ใครก็ได้โปรดช่วยฉันเข้าใจว่าทำไม?
คำตอบ:
var2 ถูกตั้งค่า แต่การขยายในบรรทัดecho %var2%
เกิดขึ้นก่อนที่จะดำเนินการบล็อก
ในเวลาvar2
นี้ว่างเปล่า
ดังนั้นไวยากรณ์ delayExpansion จึงมีอยู่โดยจะใช้!
แทน%
และจะถูกประเมิน ณ เวลาดำเนินการไม่ใช่เวลาแยกวิเคราะห์
โปรดทราบว่าในการใช้งานจำเป็นต้องมี!
คำชี้แจงเพิ่มเติมsetlocal EnableDelayedExpansion
setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
set var2=myvalue
echo !var2!
)
&
และ&&
ตัวดำเนินการ set x=some & set y=%x%thing & echo results %y%
เอาต์พุตรหัส%x%thing
นี้
ฉันไปงานปาร์ตี้ช้าไปหน่อย แต่อีกวิธีหนึ่งในการจัดการกับเงื่อนไขนี้คือดำเนินการต่อไปข้างนอก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
ใช้ บรรทัดล่างสุดหากคุณคิดใหม่ในการออกแบบสคริปต์ของคุณคุณสามารถทำได้เช่นนั้น
echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause
.. และมันใช้งานได้ "ถ้าคุณจะสร้างตัวแปรในไฟล์แบตช์ที่สามารถเข้าถึงได้จากทุกที่ในโปรแกรม" . aticleworld.com/batch-file-variables-and-scope