คำตอบสั้น ๆ - ใช้วงเล็บเหลี่ยม:
if [%1]==[] goto :blank
หรือ (เมื่อคุณต้องการจัดการอาร์กิวเมนต์ให้ดูแก้ไขด้านล่าง):
if [%~1]==[] goto :blank
ทำไม? คุณอาจถาม ก็อย่างที่ Jeremiah Willcock กล่าวไว้: http://ss64.com/nt/if.html - พวกเขาใช้สิ่งนั้น! ตกลง แต่มีอะไรผิดปกติกับเครื่องหมายคำพูด?
อีกครั้งคำตอบสั้น ๆ : พวกเขา "มีมนต์ขลัง" - บางครั้งเครื่องหมายคำพูดคู่ (คู่) จะถูกแปลงเป็นเครื่องหมายคำพูดเดี่ยว (คู่) และพวกเขาต้องจับคู่เพื่อเริ่มต้น
พิจารณาสคริปต์เล็ก ๆ นี้:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
มาทดสอบกัน:
C:\> argq bla bla
bla
bla
Done.
ดูเหมือนจะได้ผล แต่ตอนนี้ให้เปลี่ยนไปใช้เกียร์สอง:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boomสิ่งนี้ไม่ได้ประเมินว่าเป็นจริงและไม่ได้ประเมินว่าเป็นเท็จ สคริปต์ตาย ถ้าคุณควรจะปิดเครื่องปฏิกรณ์ตรงไหนสักแห่งก็โชคดี ตอนนี้คุณจะตายเหมือน Harry Daghlian
คุณอาจคิดว่า - โอเคอาร์กิวเมนต์ต้องไม่มีเครื่องหมายคำพูด หากเป็นเช่นนั้นสิ่งนี้จะเกิดขึ้น ผิดนี่คือคำปลอบใจ:
C:\> argq ""bla bla""
""bla
bla""
Done.
โอ้ใช่. ไม่ต้องกังวล - บางครั้งนี้ประสงค์การทำงาน
ลองใช้สคริปต์อื่น:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
คุณสามารถทดสอบตัวเองได้ว่าใช้งานได้ดีสำหรับกรณีข้างต้น นี่เป็นตรรกะ - คำพูดไม่มีส่วนเกี่ยวข้องกับวงเล็บดังนั้นจึงไม่มีเวทมนตร์ที่นี่ แต่สิ่งที่เกี่ยวกับการพ่นอาร์กอนด้วยวงเล็บ?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
ไม่มีโชคที่นั่น วงเล็บไม่สามารถทำให้หายใจไม่ออกcmd.exe
ของตัวแยกวิเคราะห์
ขอกลับไปที่คำพูดชั่วร้ายสักครู่ ปัญหาอยู่ที่นั่นเมื่ออาร์กิวเมนต์จบลงด้วยการอ้าง:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
จะเกิดอะไรขึ้นถ้าฉันผ่านเพียง:
D:\>argq bla2"
The syntax of the command is incorrect.
สคริปต์จะไม่ทำงานเลย เหมือนกันสำหรับargs.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
แต่ฉันจะได้อะไรเมื่อจำนวน - ตัวอักษร"
"ตรงกัน" (เช่น - เท่ากัน) ในกรณีเช่นนี้:
D:\>args bla2" "bla3
bla2" "bla3
Done.
ดี - ฉันหวังว่าคุณจะได้เรียนรู้บางอย่างเกี่ยวกับวิธีที่.bat
ไฟล์แยกอาร์กิวเมนต์บรรทัดคำสั่ง (คำแนะนำ: * มันไม่เหมือนกับใน bash) อาร์กิวเมนต์ด้านบนมีช่องว่าง แต่คำพูดจะไม่ถูกตัดออกโดยอัตโนมัติ
และ argq? มันมีปฏิกิริยาอย่างไร? คาดเดาได้:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
ดังนั้น - คิดก่อนที่จะพูดว่า: "รู้อะไรไหมเพียงแค่ใช้เครื่องหมายคำพูด [เพราะสำหรับฉันสิ่งนี้ดูดีกว่า]"
แก้ไข
เมื่อเร็ว ๆ นี้มีความคิดเห็นเกี่ยวกับคำตอบนี้เช่นกันวงเล็บเหลี่ยม "ไม่สามารถจัดการได้" โดยส่งข้อโต้แย้งที่ยกมาและปฏิบัติกับพวกเขาราวกับว่าพวกเขาไม่ได้ยกมา
ไวยากรณ์:
if "%~1"=="" (...)
ไม่ใช่คุณสมบัติที่พบใหม่ของเครื่องหมายคำพูดคู่ แต่เป็นการแสดงคุณสมบัติที่เป็นระเบียบของการตัดเครื่องหมายคำพูดจากตัวแปรอาร์กิวเมนต์หากอักขระตัวแรกและตัวสุดท้ายเป็นเครื่องหมายคำพูดคู่
"เทคโนโลยี" นี้ใช้ได้ดีกับวงเล็บเหลี่ยม:
if [%~1]==[] (...)
มันเป็นสิ่งที่มีประโยชน์ที่จะชี้ให้เห็นดังนั้นฉันจึงเพิ่มคะแนนคำตอบใหม่ด้วย
ในที่สุดแฟน ๆ ที่อ้างถึงสองครั้งมีข้อโต้แย้งของแบบฟอร์ม""
อยู่ในหนังสือของคุณหรือไม่หรือว่างเปล่า? แค่ถาม;)
GOTO BLANK
บรรทัด) ให้กับอีกสองIF
คำสั่งนั้นจะช่วยแก้ปัญหาได้หรือไม่