ฉันมีสองตัวอย่างของไฟล์แบทช์ที่ง่ายมาก:
การกำหนดค่าให้กับตัวแปร:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
ซึ่งตามที่คาดไว้ผลลัพธ์ใน:
FOO: 1 
Press any key to continue . . .
อย่างไรก็ตามถ้าฉันวางสองบรรทัดเดียวกันไว้ในบล็อก IF NOT DEFINED:
@echo off
IF NOT DEFINED BAR (
    set FOO=1
    echo FOO: %FOO%
)
pause
echo on
ผลลัพธ์นี้โดยไม่คาดหมายใน:
FOO: 
Press any key to continue . . .
นี่ไม่ควรเกี่ยวข้องกับ IF แต่อย่างใดบล็อกกำลังถูกดำเนินการ หากฉันกำหนด BAR ไว้ด้านบน if ข้อความจากคำสั่ง PAUSE เท่านั้นที่จะปรากฏขึ้นตามที่คาดไว้
สิ่งที่ช่วยให้?
คำถามติดตามผล: มีวิธีใดบ้างที่จะเปิดใช้งานการขยายที่ล่าช้าโดยไม่มี setlocal
ถ้าฉันจะเรียกไฟล์แบตช์ตัวอย่างง่าย ๆ นี้จากข้างในอีกตัวอย่างก็ตั้งค่า FOO แต่เฉพาะ LOCALLY
ตัวอย่างเช่น:
testcaller.bat
@call test.bat 
@echo FOO: %FOO% 
@pause 
test.bat
@setlocal EnableDelayedExpansion 
@IF NOT DEFINED BAR ( 
    @set FOO=1 
    @echo FOO: !FOO! 
) 
สิ่งนี้แสดง:
FOO: 1 
FOO: 
Press any key to continue . . . 
ในกรณีนี้ปรากฏว่าฉันต้องเปิดใช้งานการขยายเวลาล่าช้าใน CALLER ซึ่งอาจเป็นเรื่องยุ่งยาก
!ใช้^^^!(หนีสองครั้ง) มิฉะนั้นคุณสมบัติ "การขยายตัวล่าช้า" จะกินมัน