ฉันมีสองตัวอย่างของไฟล์แบทช์ที่ง่ายมาก:
การกำหนดค่าให้กับตัวแปร:
@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 ซึ่งอาจเป็นเรื่องยุ่งยาก
!
ใช้^^^!
(หนีสองครั้ง) มิฉะนั้นคุณสมบัติ "การขยายตัวล่าช้า" จะกินมัน