เราทำการทดลองเพื่อตรวจสอบไวยากรณ์ของสคริปต์ชุดงาน นอกจากนี้เรายังตรวจสอบความแตกต่างระหว่างแบทช์และโหมดบรรทัดคำสั่ง
Batch Line Parser:
นี่คือภาพรวมโดยย่อของเฟสในตัวแยกวิเคราะห์บรรทัดไฟล์แบทช์:
เฟส 0) อ่านบรรทัด:
ขั้นตอนที่ 1) การขยายเปอร์เซ็นต์:
เฟส 2) ประมวลผลอักขระพิเศษโทเค็นและสร้างบล็อกคำสั่งแคช:พิเศษโทเค็นนี่เป็นกระบวนการที่ซับซ้อนที่ได้รับผลกระทบจากสิ่งต่าง ๆ เช่นอัญประกาศอักขระพิเศษตัวคั่นโทเค็นและเครื่องหมายคาเร็ต
เฟส 3) สะท้อนคำสั่งที่แยกวิเคราะห์เฉพาะเมื่อบล็อกคำสั่งไม่ได้ขึ้นต้นด้วย@
และ ECHO เปิดอยู่ที่จุดเริ่มต้นของขั้นตอนก่อนหน้า
เฟส 4) สำหรับ%X
การขยายตัวแปร:เฉพาะเมื่อคำสั่ง FOR แอ็คทีฟและคำสั่งหลังจาก DO กำลังถูกประมวลผล
ขั้นตอนที่ 5) การขยายล่าช้า:เฉพาะเมื่อเปิดใช้งานการขยายล่าช้า
เฟส 5.3) การประมวลผลไปป์:เฉพาะเมื่อคำสั่งอยู่ที่ด้านใดด้านหนึ่งของไปป์
เฟส 5.5) ดำเนินการเปลี่ยนเส้นทาง:
เฟส 6) การประมวลผล CALL / Caret เพิ่มเป็นสองเท่า:เฉพาะเมื่อโทเค็นคำสั่งคือ CALL
เฟส 7) ดำเนินการ:คำสั่งถูกดำเนินการ
นี่คือรายละเอียดสำหรับแต่ละเฟส:
โปรดทราบว่าเฟสที่อธิบายด้านล่างนี้เป็นเพียงรูปแบบการทำงานของตัวแยกวิเคราะห์แบบแบทช์ cmd.exe ที่เกิดขึ้นจริงอาจไม่แสดงถึงขั้นตอนเหล่านี้ แต่รุ่นนี้มีประสิทธิภาพในการทำนายพฤติกรรมของสคริปต์แบบแบทช์
เฟส 0) อ่านบรรทัด:<LF>
อ่านบรรทัดของการป้อนข้อมูลผ่านครั้งแรก
- เมื่ออ่านบรรทัดที่จะวิเคราะห์คำเป็นคำสั่ง
<Ctrl-Z>
(0x1A) จะอ่านว่าเป็น<LF>
(LineFeed 0x0A)
- เมื่อ GOTO หรือ CALL อ่านบรรทัดขณะสแกนหา: label
<Ctrl-Z>
จะถือว่าเป็นตัวของมันเองซึ่งจะไม่ถูกแปลงเป็น<LF>
ขั้นตอนที่ 1) การขยายเปอร์เซ็นต์:
- ดับเบิล
%%
ถูกแทนที่ด้วยซิงเกิ้ล%
- การขยายตัวของการขัดแย้ง (
%*
, %1
,%2
ฯลฯ )
- การขยายตัวของ
%var%
ถ้า var ไม่มีอยู่แทนที่ด้วยไม่มีอะไร
- บรรทัดจะถูกปัดเศษในตอนแรก
<LF>
ไม่ใช่ภายในส่วน%var%
ขยาย
- สำหรับคำอธิบายที่สมบูรณ์อ่านครึ่งแรกของเรื่องนี้จาก dbenham หัวข้อเดียวกัน: Percent Phase
ขั้นตอนที่ 2) ประมวลผลอักขระพิเศษโทเค็นและสร้างบล็อกคำสั่งแคช:นี่เป็นกระบวนการที่ซับซ้อนที่ได้รับผลกระทบจากสิ่งต่าง ๆ เช่นอัญประกาศอักขระพิเศษตัวคั่นโทเค็นและเครื่องหมายคาเร็ต สิ่งที่ตามมาคือการประมาณของกระบวนการนี้
มีแนวคิดที่สำคัญตลอดช่วงนี้
- โทเค็นเป็นเพียงสตริงของอักขระที่ถือว่าเป็นหน่วย
- โทเค็นถูกคั่นด้วยตัวคั่นโทเค็น ตัวคั่นโทเค็นมาตรฐานคือ
<space>
<tab>
;
,
=
<0x0B>
<0x0C>
และ<0xFF>
ตัวคั่นโทเค็นต่อเนื่องจะถือว่าเป็นหนึ่ง - ไม่มีโทเค็นว่างระหว่างตัวคั่นโทเค็น
- ไม่มีตัวคั่นโทเค็นภายในสตริงที่ยกมา สตริงที่ยกมาทั้งหมดจะถือว่าเป็นส่วนหนึ่งของโทเค็นเดียวเสมอ โทเค็นเดียวอาจประกอบด้วยการรวมกันของสตริงที่ยกมาและตัวอักษรที่ไม่ยกมา
อักขระต่อไปนี้อาจมีความหมายพิเศษในเฟสนี้ขึ้นอยู่กับบริบท: <CR>
^
(
@
&
|
<
>
<LF>
<space>
<tab>
;
,
=
<0x0B>
<0x0C>
<0xFF>
ดูตัวละครแต่ละตัวจากซ้ายไปขวา:
- หาก
<CR>
ลบออกราวกับว่ามันไม่เคยมี (ยกเว้นพฤติกรรมการเปลี่ยนเส้นทางแปลก)
- หากเครื่องหมายรูปหมวก (
^
) ตัวละครถัดไปจะถูกหลบหนีและเครื่องหมายรูปหมวกจะถูกลบออก อักขระที่หลีกเลี่ยงสูญเสียความหมายพิเศษทั้งหมด (ยกเว้น<LF>
)
- ถ้า quote (
"
) ให้สลับค่าสถานะ quote หากเครื่องหมายคำพูดเปิดใช้งานอยู่เฉพาะ"
และ<LF>
พิเศษเท่านั้น ตัวละครอื่น ๆ ทั้งหมดจะสูญเสียความหมายพิเศษของพวกเขาจนกว่าการอ้างอิงครั้งต่อไปจะสลับการปิดการอ้างอิง มันเป็นไปไม่ได้ที่จะหนีจากคำพูดปิด อักขระที่ยกมาทั้งหมดอยู่ในโทเค็นเดียวกันเสมอ
<LF>
ปิดการใช้งานเครื่องหมายคำพูดเสมอ พฤติกรรมอื่น ๆ แตกต่างกันไปขึ้นอยู่กับบริบท <LF>
แต่คำพูดที่ไม่เคยเปลี่ยนแปลงพฤติกรรมของ
- หนี
<LF>
<LF>
ถูกปล้น
- ตัวละครต่อไปคือการหลบหนี หากในตอนท้ายของบัฟเฟอร์บรรทัดแล้วบรรทัดถัดไปจะถูกอ่านและประมวลผลโดยเฟส 1 และ 1.5 และผนวกเข้ากับหนึ่งในปัจจุบันก่อนที่จะหลบหนีตัวอักษรต่อไป หากตัวละครถัดไปคือ
<LF>
มันจะถือว่าเป็นตัวอักษรหมายถึงกระบวนการนี้จะไม่เกิดซ้ำ
<LF>
ไม่ใช้ค่าEscape ไม่อยู่ในวงเล็บ
<LF>
ถูกปล้นและการแยกวิเคราะห์บรรทัดปัจจุบันถูกยกเลิก
- อักขระที่เหลืออยู่ในบัฟเฟอร์บรรทัดจะถูกละเว้น
- ไม่ใช้ค่า Escape
<LF>
ภายในบล็อกที่ใส่เครื่องหมายวงเล็บใน
<LF>
ถูกแปลงเป็น <space>
- หากท้ายบรรทัดบัฟเฟอร์แล้วบรรทัดถัดไปจะถูกอ่านและผนวกเข้ากับบัฟเฟอร์ปัจจุบัน
- unescaped
<LF>
ภายในบล็อกคำสั่งวงเล็บ
<LF>
จะถูกแปลงเป็น<LF><space>
และ<space>
จะถือว่าเป็นส่วนหนึ่งของบรรทัดถัดไปของบล็อกคำสั่ง
- หากท้ายบัฟเฟอร์บรรทัดบรรทัดถัดไปจะถูกอ่านและผนวกเข้ากับพื้นที่
- หากหนึ่งในตัวละครพิเศษ
&
|
<
หรือ>
แยกบรรทัดที่จุดนี้เพื่อจัดการท่อ, การต่อคำสั่งและการเปลี่ยนเส้นทาง
- ในกรณีของไพพ์ (
|
) แต่ละข้างเป็นคำสั่งแยกต่างหาก (หรือบล็อกคำสั่ง) ที่ได้รับการจัดการพิเศษในเฟส 5.3
- ในกรณีของ
&
, &&
หรือการ||
ต่อคำสั่ง, แต่ละด้านของการต่อข้อมูลจะถือว่าเป็นคำสั่งแยกกัน
- ในกรณีของ
<
, <<
, >
หรือ>>
การเปลี่ยนเส้นทางข้อเปลี่ยนเส้นทางจะแยกออกชั่วคราวแล้วต่อท้ายคำสั่งปัจจุบัน ส่วนคำสั่งเปลี่ยนเส้นทางประกอบด้วยตัวเลขตัวจัดการไฟล์ทางเลือกตัวดำเนินการเปลี่ยนเส้นทางและโทเค็นปลายทางการเปลี่ยนเส้นทาง
- หากโทเค็นที่นำหน้าโอเปอเรเตอร์โอเปอเรเตอร์เป็นตัวเลขที่ไม่มีค่า Escape เดียวหลักจะระบุว่าหมายเลขอ้างอิงไฟล์จะถูกเปลี่ยนเส้นทาง หากไม่พบโทเค็นการจัดการดังนั้นค่าเริ่มต้นการเปลี่ยนเส้นทางการส่งออกเป็น 1 (stdout) และค่าเริ่มต้นการเปลี่ยนเส้นทางการป้อนข้อมูลเป็น 0 (stdin)
- หากโทเค็นแรกสำหรับคำสั่งนี้ (ก่อนที่จะย้ายการเปลี่ยนเส้นทางไปยังจุดสิ้นสุด) เริ่มต้นด้วย
@
แสดงว่า@
มีความหมายพิเศษ ( @
ไม่พิเศษในบริบทอื่น ๆ )
- พิเศษ
@
จะถูกลบออก
- หาก ECHO เปิดอยู่คำสั่งนี้พร้อมกับคำสั่งต่อไปนี้ในบรรทัดนี้จะถูกแยกออกจากเฟส 3 echo ถ้า
@
เป็นก่อนการเปิด(
บล็อกทั้งหมดที่อยู่ในวงเล็บจะถูกแยกออกจาก echo เฟส 3
- วงเล็บกระบวนการ (จัดทำขึ้นสำหรับคำสั่งผสมข้ามหลายบรรทัด):
- หาก parser ไม่ได้ค้นหาโทเค็นคำสั่งแสดงว่า
(
ไม่พิเศษ
- หาก parser กำลังมองหาโทเค็นคำสั่งและค้นหา
(
จากนั้นเริ่มคำสั่งผสมใหม่และเพิ่มตัวนับวงเล็บ
- หากตัวนับวงเล็บเป็น> 0 ให้
)
ยกเลิกคำสั่งผสมและลดจำนวนตัวนับวงเล็บ
- หากถึงจุดสิ้นสุดของบรรทัดและตัวนับวงเล็บคือ> 0 ดังนั้นบรรทัดถัดไปจะถูกผนวกเข้ากับคำสั่งผสม (เริ่มอีกครั้งด้วยเฟส 0)
- หากตัวนับวงเล็บเป็น 0 และเครื่องมือแยกวิเคราะห์กำลังมองหาคำสั่ง
)
ฟังก์ชันจะคล้ายกับREM
คำสั่งตราบใดที่มันถูกตามด้วยตัวคั่นโทเค็นอักขระพิเศษบรรทัดใหม่หรือจุดสิ้นสุดของไฟล์ทันที
- อักขระพิเศษทั้งหมดสูญเสียความหมายยกเว้น
^
(สามารถต่อการต่อบรรทัดได้)
- เมื่อถึงจุดสิ้นสุดของบรรทัดตรรกะแล้วคำสั่ง "ทั้งหมด" จะถูกยกเลิก
- แต่ละคำสั่งจะถูกแยกวิเคราะห์เป็นชุดโทเค็น โทเค็นแรกจะถือว่าเป็นโทเค็นคำสั่งเสมอ (หลังจากพิเศษ)
@
ถูกปล้นและการเปลี่ยนเส้นทางถูกย้ายไปยังจุดสิ้นสุด)
- ตัวคั่นโทเค็นนำหน้าก่อนโทเค็นคำสั่งจะถูกปล้น
- เมื่อแยกโทเค็นคำสั่ง
(
ทำหน้าที่เป็นตัวคั่นคำสั่งโทเค็นนอกเหนือจากตัวคั่นโทเค็นมาตรฐาน
- การจัดการโทเค็นที่ตามมาขึ้นอยู่กับคำสั่ง
- คำสั่งส่วนใหญ่จะทำการเชื่อมอาร์กิวเมนต์ทั้งหมดหลังจากโทเค็นคำสั่งเป็นโทเค็นอาร์กิวเมนต์เดียว ตัวคั่นโทเค็นอาร์กิวเมนต์ทั้งหมดจะถูกเก็บรักษาไว้ ตัวเลือกอาร์กิวเมนต์มักจะไม่แยกวิเคราะห์จนกว่าจะถึงระยะที่ 7
- สามคำสั่งได้รับการจัดการพิเศษ - IF, FOR และ REM
- IF ถูกแบ่งออกเป็นสองหรือสามส่วนที่แตกต่างกันซึ่งดำเนินการอย่างอิสระ ข้อผิดพลาดทางไวยากรณ์ในโครงสร้าง IF จะส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์ที่ร้ายแรง
- การดำเนินการเปรียบเทียบเป็นคำสั่งจริงที่ไหลไปตลอดจนถึงระยะที่ 7
- ตัวเลือก IF ทั้งหมดจะถูกวิเคราะห์คำอย่างสมบูรณ์ในเฟส 2
- ตัวคั่นโทเค็นติดต่อกันยุบลงในช่องว่างเดียว
- ขึ้นอยู่กับตัวดำเนินการเปรียบเทียบจะมีโทเค็นค่าหนึ่งหรือสองค่าที่ระบุ
- บล็อกคำสั่ง True คือชุดคำสั่งหลังจากเงื่อนไขและแยกวิเคราะห์เหมือนกับบล็อกคำสั่งอื่น ๆ ถ้าจะใช้ ELSE บล็อก True จะต้องถูกวงเล็บ
- บล็อกคำสั่ง False ที่เป็นทางเลือกคือชุดคำสั่งหลังจาก ELSE อีกครั้งบล็อกคำสั่งนี้จะถูกแยกวิเคราะห์ตามปกติ
- บล็อกคำสั่งจริงและเท็จจะไม่ไหลเข้าสู่ระยะต่อมาโดยอัตโนมัติ การประมวลผลที่ตามมาของพวกเขาถูกควบคุมโดยเฟส 7
- FOR ถูกแบ่งออกเป็นสองส่วนหลังจากการใช้ DO ข้อผิดพลาดทางไวยากรณ์ในการก่อสร้าง FOR จะส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์ที่ร้ายแรง
- ส่วนที่ผ่าน DO เป็นคำสั่ง FOR ซ้ำที่เกิดขึ้นจริงซึ่งไหลไปตลอดทางจนถึงเฟส 7
- ตัวเลือก FOR ทั้งหมดจะถูกวิเคราะห์คำอย่างสมบูรณ์ในเฟส 2
- ในวงเล็บถือว่าข้อเป็น
<LF>
<space>
หลังจากแยกประโยค IN แล้วโทเค็นทั้งหมดจะถูกต่อกันเข้าด้วยกันเพื่อสร้างโทเค็นเดี่ยว
- ตัวคั่นโทเค็นที่ไม่ใช้ค่า Escape / unquoted ติดต่อกันจะยุบลงในช่องว่างเดียวตลอดทั้งคำสั่ง FOR ถึง DO
- ส่วนหลังจาก DO คือบล็อกคำสั่งที่แยกวิเคราะห์ตามปกติ การประมวลผลที่ตามมาของบล็อกคำสั่ง DO ถูกควบคุมโดยการวนซ้ำในเฟส 7
- การตรวจพบ REM ในระยะที่ 2 นั้นถือว่าแตกต่างอย่างมากจากคำสั่งอื่นทั้งหมด
- มีการแยกวิเคราะห์โทเค็นอาร์กิวเมนต์เดียวเท่านั้น - ตัวแยกวิเคราะห์จะละเว้นอักขระหลังจากโทเค็นอาร์กิวเมนต์แรก
- คำสั่ง REM อาจปรากฏในเอาต์พุตเฟส 3 แต่คำสั่งไม่เคยถูกเรียกใช้งานและข้อความอาร์กิวเมนต์ดั้งเดิมจะถูก echoed - carets ที่กำลังหลบหนีจะไม่ถูกลบยกเว้น ...
- หากมีเพียงโทเค็นการโต้แย้งเพียงตัวเดียวที่จบลงด้วยการไม่ใช้ Escape
^
ที่สิ้นสุดบรรทัดโทเค็นการโต้แย้งจะถูกโยนออกไปและบรรทัดต่อมาจะถูกแยกวิเคราะห์และผนวกเข้ากับ REM ^
ซ้ำนี้จนกว่าจะมีมากกว่าหนึ่งโทเค็นหรือตัวอักษรตัวสุดท้ายไม่ได้เป็น
- หากโทเค็นคำสั่งเริ่มต้นด้วย
:
และนี่คือรอบแรกของเฟส 2 (ไม่ใช่การรีสตาร์ทเนื่องจาก CALL ในเฟส 6)
- โดยปกติแล้วโทเค็นจะถือว่าเป็นป้ายกำกับที่ยังไม่ได้ดำเนินการ
- ส่วนที่เหลือของเส้นจะแยกกันอย่างไร
)
, <
, >
, &
และ|
ไม่ได้มีความหมายพิเศษ ส่วนที่เหลือทั้งหมดของบรรทัดนั้นถือว่าเป็นส่วนหนึ่งของป้ายกำกับ "คำสั่ง"
^
ยังคงเป็นพิเศษหมายความว่าสายต่อเนื่องสามารถใช้ในการผนวกบรรทัดต่อมาให้กับต้นสังกัด
- ป้าย unexecutedภายในบล็อกวงเล็บจะมีผลในไวยากรณ์ผิดพลาดร้ายแรงจนกว่าจะมีการทันทีตามคำสั่งหรือดำเนินการป้ายในบรรทัดถัดไป
(
ไม่มีความหมายพิเศษสำหรับคำสั่งแรกที่ตามหลังป้ายกำกับที่ยังไม่ได้ดำเนินการ
- คำสั่งถูกยกเลิกหลังจากการแยกวิเคราะห์ฉลากเสร็จสมบูรณ์ ขั้นตอนต่อมาจะไม่เกิดขึ้นกับฉลาก
- มีข้อยกเว้นสามข้อที่สามารถทำให้ป้ายกำกับที่พบในระยะที่ 2 ถูกถือว่าเป็นป้ายกำกับที่ดำเนินการซึ่งจะดำเนินการแยกวิเคราะห์ผ่านขั้นตอนที่ 7 ต่อไป
- มีการเปลี่ยนเส้นทางคือว่าแจ๋วฉลากโทเค็นและมี
|
ท่อหรือ&
, &&
หรือ||
เรียงต่อกันคำสั่งในบรรทัด
- มีการเปลี่ยนเส้นทางที่นำหน้าโทเค็นป้ายกำกับและคำสั่งอยู่ในบล็อกที่มีเครื่องหมายวงเล็บ
- โทเค็นเลเบลคือคำสั่งแรกสุดของบรรทัดภายในบล็อกที่อยู่ในวงเล็บและบรรทัดด้านบนจบลงด้วยป้ายกำกับที่ไม่ได้ดำเนินการ
- สิ่งต่อไปนี้เกิดขึ้นเมื่อพบป้ายกำกับที่ดำเนินการในเฟส 2
- เลเบลอาร์กิวเมนต์และการเปลี่ยนทิศทางทั้งหมดถูกแยกออกจากเอาต์พุต echo ใด ๆ ในเฟส 3
- คำสั่งที่ต่อกันใด ๆ บนบรรทัดจะถูกวิเคราะห์และดำเนินการอย่างสมบูรณ์
- สำหรับข้อมูลเพิ่มเติมเกี่ยวกับป้ายดำเนินการกับป้าย unexecutedดูhttps://www.dostips.com/forum/viewtopic.php?f=3&t=3803&p=55405#p55405
เฟส 3) สะท้อนคำสั่งที่แยกวิเคราะห์เฉพาะเมื่อบล็อกคำสั่งไม่ได้ขึ้นต้นด้วย@
และ ECHO เปิดอยู่ที่จุดเริ่มต้นของขั้นตอนก่อนหน้า
เฟส 4) สำหรับ%X
การขยายตัวแปร:เฉพาะเมื่อคำสั่ง FOR แอ็คทีฟและคำสั่งหลังจาก DO กำลังถูกประมวลผล
- ณ จุดนี้เฟส 1 ของการประมวลผลชุดจะมีแปลงแล้วสำหรับตัวแปรเช่นเข้า
%%X
%X
บรรทัดคำสั่งมีกฎการขยายตัวร้อยละที่แตกต่างกันสำหรับเฟส 1 นี้คือเหตุผลที่บรรทัดคำสั่งใช้%X
แต่ไฟล์ชุดใช้%%X
สำหรับสำหรับตัวแปร
- สำหรับชื่อตัวแปรคำนึงถึงขนาดตัวพิมพ์ แต่
~modifiers
ไม่คำนึงถึงขนาดตัวพิมพ์
~modifiers
มีความสำคัญมากกว่าชื่อตัวแปร หากตัวอักษรต่อไปนี้~
เป็นทั้งตัวดัดแปลงและชื่อตัวแปรที่ถูกต้องสำหรับและมีตัวละครที่ตามมาที่เป็นชื่อตัวแปรสำหรับการใช้งานแล้วตัวละครจะถูกตีความว่าเป็นตัวดัดแปลง
- สำหรับชื่อตัวแปรนั้นเป็นชื่อโกลบอล แต่จะอยู่ในบริบทของประโยคคำสั่ง DO เท่านั้น หากรูทีนถูกเรียกจากภายในประโยค FOR DO ตัวแปร FOR จะไม่ถูกขยายภายในรูทีน CALLed แต่ถ้ารูทีนมีคำสั่ง FOR ของตัวเองตัวแปรที่กำหนดไว้ในปัจจุบันทั้งหมดจะสามารถเข้าถึงคำสั่ง DO ภายในได้
- สำหรับชื่อตัวแปรสามารถนำกลับมาใช้ใหม่ได้ภายใน FORs ที่ซ้อนกัน ค่า Inner สำหรับมีความสำคัญกว่าเดิม แต่เมื่อ INNER FOR ปิดลงค่าด้านนอก FOR จะถูกกู้คืน
- หาก ECHO เปิดอยู่ที่จุดเริ่มต้นของขั้นตอนนี้ระยะที่ 3) จะถูกทำซ้ำเพื่อแสดงคำสั่ง DO แยกวิเคราะห์หลังจากตัวแปร FOR ถูกขยาย
---- จากจุดนี้เป็นต้นไปแต่ละคำสั่งที่ระบุในเฟส 2 จะถูกประมวลผลแยกกัน
---- ขั้นตอนที่ 5 ถึง 7 จะเสร็จสมบูรณ์สำหรับคำสั่งเดียวก่อนที่จะย้ายไปยังถัดไป
ขั้นตอนที่ 5) การขยายล่าช้า:เฉพาะเมื่อการขยายล่าช้าเปิดอยู่คำสั่งไม่ได้อยู่ในบล็อกที่อยู่ในวงเล็บที่ด้านใดด้านหนึ่งของไปป์และคำสั่งไม่ได้เป็นชุดสคริปต์ "เปล่า" (ชื่อสคริปต์ที่ไม่มีวงเล็บ, CALL, การต่อประสานคำสั่ง หรือท่อ)
- แต่ละโทเค็นสำหรับคำสั่งจะถูกวิเคราะห์คำสำหรับการขยายที่ล่าช้าอย่างอิสระ
- คำสั่งส่วนใหญ่แยกโทเค็นอย่างน้อยสองโทเค็น - โทเค็นคำสั่งโทเค็นอาร์กิวเมนต์และโทเค็นปลายทางการเปลี่ยนเส้นทางแต่ละรายการ
- คำสั่ง FOR แยกวิเคราะห์โทเค็นส่วนคำสั่ง IN เท่านั้น
- คำสั่ง IF แยกวิเคราะห์ค่าการเปรียบเทียบเท่านั้น - หนึ่งหรือสองขึ้นอยู่กับผู้ประกอบการเปรียบเทียบ
- สำหรับโทเค็นการวิเคราะห์คำแต่ละรายการก่อนอื่นให้ตรวจสอบว่ามีโทเค็นใด ๆ หรือ
!
ไม่ มิฉะนั้นโทเค็นจะไม่ถูกวิเคราะห์ - สำคัญสำหรับ^
อักขระ หากโทเค็นประกอบด้วย!
ให้สแกนอักขระแต่ละตัวจากซ้ายไปขวา:
- ถ้าเป็น caret (
^
) อักขระถัดไปไม่มีความหมายพิเศษคาเร็ตจะถูกลบออก
- หากเป็นเครื่องหมายอัศเจรีย์ให้ค้นหาเครื่องหมายอัศเจรีย์ถัดไป (ไม่พบเครื่องหมายคาเร็ตอีกต่อไป) ขยายเป็นค่าของตัวแปร
- เปิดอย่างต่อเนื่อง
!
จะถูกยุบเป็นหนึ่งเดียว!
- ส่วนที่เหลือที่ไม่ได้รับการชำระ
!
จะถูกลบออก
- การขยาย vars ในขั้นนี้คือ "ปลอดภัย" เนื่องจากไม่พบอักขระพิเศษอีกต่อไป (แม้
<CR>
หรือ<LF>
)
- สำหรับคำอธิบายที่สมบูรณ์ยิ่งขึ้นอ่านครึ่งหลังของหัวข้อนี้จากหัวข้อเดียวกัน dbenham
- Exclamation Point Phase
เฟส 5.3) การประมวลผลไปป์:เฉพาะเมื่อคำสั่งอยู่ที่ด้านใดด้านหนึ่งของไปป์
แต่ละด้านของไพพ์จะถูกประมวลผลอย่างอิสระและแบบอะซิงโครนัส
- หากคำสั่งอยู่ภายใน cmd.exe หรือเป็นไฟล์แบตช์หรือหากเป็นบล็อกคำสั่งที่ใช้วงเล็บแล้วจะถูกดำเนินการในเธรด cmd.exe ใหม่ผ่านทาง
%comspec% /S /D /c" commandBlock"
ดังนั้นบล็อกคำสั่งจะได้รับการรีสตาร์ทเฟส แต่คราวนี้ ในโหมดบรรทัดคำสั่ง
- หากบล็อกคำสั่งวงเล็บแล้วทั้งหมดที่มีคำสั่งก่อนและหลังจะถูกแปลงเป็น
<LF>
<space>&
อื่น ๆ<LF>
ถูกปล้น
- นี่คือจุดสิ้นสุดของการประมวลผลสำหรับคำสั่งไพพ์
- ดูที่เหตุใดการขยายที่ล่าช้าจึงล้มเหลวเมื่ออยู่ในบล็อกของ piped code สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแยกวิเคราะห์ท่อและการประมวลผล
ขั้นตอน 5.5) ดำเนินการเปลี่ยนเส้นทาง: การเปลี่ยนเส้นทางใด ๆ ที่ค้นพบในระยะที่ 2 จะถูกดำเนินการในขณะนี้
เฟส 6) การประมวลผล CALL / Caret เพิ่มเป็นสองเท่า:เฉพาะในกรณีที่คำสั่งโทเค็นเป็น CALL หรือหากข้อความก่อนที่ตัวคั่นโทเค็นมาตรฐานที่เกิดขึ้นครั้งแรกคือ CALL หาก CALL ถูกแยกวิเคราะห์จากโทเค็นคำสั่งที่มีขนาดใหญ่ส่วนที่ไม่ได้ใช้จะถูกนำไปรวมกับโทเค็นอาร์กิวเมนต์ก่อนดำเนินการต่อ
- สแกนโทเค็นอาร์กิวเมนต์เพื่อหาค่าที่
/?
ไม่ได้อ้างอิง หากพบที่ใดก็ได้ภายในโทเค็นให้ยกเลิกขั้นตอนที่ 6 และไปที่ขั้นตอนที่ 7 ซึ่งจะมีการพิมพ์ HELP สำหรับ CALL
- ลบออกก่อน
CALL
ดังนั้นจึงสามารถซ้อน CALL หลายรายการได้
- carets สองเท่าทั้งหมด
- รีสตาร์ทเฟส 1, 1.5 และ 2 แต่อย่าดำเนินการต่อในเฟส 3
- เครื่องหมายคาเร็ตที่เป็นสองเท่าใด ๆ จะถูกลดกลับเป็นคาเร็ตหนึ่งอันตราบใดที่มันไม่ได้ยกมา แต่น่าเสียดายที่ carets ที่ยกมายังคงเป็นสองเท่า
- ขั้นตอนที่ 1 การเปลี่ยนแปลงเล็กน้อย
- ข้อผิดพลาดการขยายในขั้นตอนที่ 1.2 หรือ 1.3 ยกเลิก CALL แต่ข้อผิดพลาดนั้นไม่ร้ายแรง - การประมวลผลแบบต่อเนื่องจะดำเนินต่อไป
- งานเฟส 2 จะเปลี่ยนไปเล็กน้อย
- ตรวจพบการเปลี่ยนทิศทางที่ไม่มีการอ้างอิงใหม่ซึ่งไม่ได้กล่าวถึงซึ่งไม่ถูกตรวจพบในรอบแรกของเฟส 2 แต่จะถูกลบออก (รวมถึงชื่อไฟล์) โดยไม่ทำการเปลี่ยนเส้นทางจริงๆ
- เครื่องหมายคาเร็ตที่ยังไม่ได้ใส่เครื่องหมายใหม่ใด ๆ ที่ปรากฏในตอนท้ายของบรรทัดจะถูกลบออกโดยไม่ดำเนินการต่อเนื่องของบรรทัด
- CALL ถูกยกเลิกโดยไม่มีข้อผิดพลาดหากตรวจพบสิ่งต่อไปนี้
- ที่เพิ่งปรากฏขึ้นโดยไม่ระบุชื่อ unescaped
&
หรือ|
- โทเค็นคำสั่ง resultant เริ่มต้นด้วย unquoted, unescaped
(
- โทเค็นแรก ๆ หลังจาก CALL ที่ถูกลบเริ่มต้นด้วย
@
- หากคำสั่งผลลัพธ์เป็น IF หรือ FOR ที่ถูกต้องดูเหมือนว่าการดำเนินการจะล้มเหลวในภายหลังโดยมีข้อผิดพลาดที่ระบุว่า
IF
หรือFOR
ไม่ได้รับการยอมรับว่าเป็นคำสั่งภายในหรือภายนอก
- แน่นอนโทรไม่ได้ยกเลิกในรอบที่ 2 ของขั้นตอนที่ 2
:
ถ้าโทเค็นคำสั่งผลเป็นจุดเริ่มต้นที่มีฉลาก
- หากโทเค็นคำสั่งผลลัพธ์เป็น CALL ให้รีสตาร์ทเฟส 6 (ทำซ้ำจนกว่าจะไม่มี CALL อีกต่อไป)
- หากโทเค็นคำสั่ง resultant เป็นแบตช์สคริปต์หรือฉลาก: การดำเนินการของ CALL จะได้รับการจัดการอย่างเต็มที่โดยส่วนที่เหลือของเฟส 6
- พุชตำแหน่งไฟล์แบตช์สคริปต์ปัจจุบันบน call stack เพื่อให้การดำเนินการสามารถดำเนินต่อจากตำแหน่งที่ถูกต้องเมื่อ CALL เสร็จสมบูรณ์
- ตั้งค่าอาร์กิวเมนต์โทเค็น% 0,% 1,% 2, ... % N และ% * สำหรับการโทรโดยใช้โทเค็นผลลัพธ์ทั้งหมด
- หากโทเค็นคำสั่งเป็นป้ายกำกับที่ขึ้นต้นด้วย
:
แล้ว
- รีสตาร์ทเฟส 5 สิ่งนี้อาจส่งผลต่อสิ่งที่: label ถูกเรียก แต่เนื่องจากโทเค็น% 0 และอื่น ๆ ได้รับการตั้งค่าแล้วมันจะไม่เปลี่ยนอาร์กิวเมนต์ที่ส่งผ่านไปยังรูทีน CALLed
- ดำเนินการป้ายกำกับ GOTO เพื่อวางตำแหน่งตัวชี้ไฟล์ที่จุดเริ่มต้นของรูทีนย่อย (ละเว้นโทเค็นอื่น ๆ ที่อาจเป็นไปตาม: label) ดูขั้นตอนที่ 7 สำหรับกฎเกี่ยวกับวิธีการทำงานของ GOTO
- การควบคุมการถ่ายโอนอื่นไปยังสคริปต์ชุดงานที่ระบุ
- การดำเนินการของ CALLed: เลเบลหรือสคริปต์ดำเนินต่อไปจนกระทั่ง EXIT / B หรือถึงจุดสิ้นสุดไฟล์สิ้นสุด ณ จุดที่สแต็ก CALL ถูกเปิดและการดำเนินการต่อจากตำแหน่งไฟล์ที่บันทึกไว้
เฟส 7 ไม่ถูกเรียกใช้งานสำหรับสคริปต์ที่เรียกว่าหรือ: ป้ายกำกับ
- มิฉะนั้นผลลัพธ์ของเฟส 6 จะเข้าสู่เฟส 7 เพื่อดำเนินการ
เฟส 7) ดำเนินการ:คำสั่งถูกดำเนินการ
- 7.1 - ดำเนินการคำสั่งภายใน - หากมีการยกโทเค็นคำสั่งให้ข้ามขั้นตอนนี้ มิฉะนั้นพยายามแยกคำสั่งภายในและดำเนินการ
- การทดสอบต่อไปนี้ทำขึ้นเพื่อพิจารณาว่าโทเค็นคำสั่งที่ไม่ได้อ้างถึงแสดงถึงคำสั่งภายในหรือไม่:
- หากโทเค็นคำสั่งตรงกับคำสั่งภายในทั้งหมดให้รันคำสั่งนั้น
- อื่นทำลายโทเค็นคำสั่งก่อนที่จะเกิดขึ้นครั้งแรก
+
/
[
]
<space>
<tab>
,
;
หรือ=
ถ้าข้อความก่อนหน้านี้เป็นคำสั่งภายในแล้วจำคำสั่งนั้น
- ถ้าอยู่ในโหมดบรรทัดคำสั่งหรือถ้าคำสั่งมาจากบล็อกวงเล็บ, IF บล็อกคำสั่งจริงหรือเท็จ, บล็อกคำสั่ง FOR DO, หรือเกี่ยวข้องกับการต่อคำสั่งแล้วรันคำสั่งภายใน
- อื่น (ต้องเป็นคำสั่งแบบสแตนด์อะโลนในโหมดแบตช์) สแกนโฟลเดอร์ปัจจุบันและไฟล์ PATH สำหรับไฟล์. COM, .EXE, .BAT หรือ. CMD ที่มีชื่อฐานตรงกับโทเค็นคำสั่งดั้งเดิม
- หากไฟล์แรกที่ตรงกันคือ .BAT หรือ. CMD ให้ไปที่ 7.3.exec แล้วจึงเรียกใช้งานสคริปต์ดังกล่าว
- อื่น (ไม่พบคู่ที่ตรงกันหรือคู่แรกคือ. EXE หรือ. COM) เรียกใช้งานคำสั่งภายในที่จำได้
- อื่นทำลายโทเค็นคำสั่งก่อนที่จะเกิดขึ้นครั้งแรก
.
\
หรือ:
ถ้าข้อความก่อนหน้านี้ไม่ได้เป็นคำสั่งภายในแล้วข้ามไป 7.2
ข้อความอื่น ๆ อาจเป็นคำสั่งภายใน จำคำสั่งนี้
- ทำลายโทเค็นคำสั่งก่อนที่จะเกิดขึ้นครั้งแรกของ
+
/
[
]
<space>
<tab>
,
;
หรือ=
ถ้าข้อความก่อนหน้านี้เป็นเส้นทางไปยังไฟล์ที่มีอยู่แล้ว goto 7.2
อื่นดำเนินการคำสั่งภายในที่จำได้
- หากคำสั่งภายในถูกแยกวิเคราะห์จากโทเค็นคำสั่งขนาดใหญ่ส่วนโทเค็นคำสั่งที่ไม่ได้ใช้จะรวมอยู่ในรายการอาร์กิวเมนต์
- เพียงเพราะโทเค็นคำสั่งถูกแยกวิเคราะห์เป็นคำสั่งภายในไม่ได้หมายความว่ามันจะดำเนินการได้สำเร็จ แต่ละคำสั่งภายในมีกฎของตัวเองสำหรับวิธีการแยกวิเคราะห์อาร์กิวเมนต์และตัวเลือกและไวยากรณ์ที่ได้รับอนุญาต
- คำสั่งภายในทั้งหมดจะพิมพ์ความช่วยเหลือแทนการปฏิบัติหน้าที่หาก
/?
ตรวจพบ ส่วนใหญ่รู้จัก/?
ถ้ามันปรากฏที่ใดก็ได้ในการโต้แย้ง แต่ไม่กี่คำสั่งเช่น ECHO /?
และตลาดหลักทรัพย์พิมพ์เฉพาะความช่วยเหลือหากโทเค็นอาร์กิวเมนต์แรกเริ่มต้นด้วย
- ตลาดหลักทรัพย์มีความหมายที่น่าสนใจ:
- หากคำสั่ง SET มีอัญประกาศก่อนที่ชื่อตัวแปรและส่วนขยายจะเปิดใช้งาน
set "name=content" ignored
-> value = content
ดังนั้นข้อความระหว่างเครื่องหมายเท่ากับแรกและเครื่องหมายคำพูดสุดท้ายจะถูกใช้เป็นเนื้อหา ข้อความหลังจากเครื่องหมายคำพูดสุดท้ายจะถูกละเว้น หากไม่มีเครื่องหมายคำพูดหลังเครื่องหมายเท่ากับจะใช้ส่วนที่เหลือเป็นเนื้อหา
- หากคำสั่ง SET ไม่มีเครื่องหมายอัญประกาศหน้าชื่อ
set name="content" not ignored
-> value = "content" not ignored
หมายถึงส่วนที่เหลือทั้งหมดของบรรทัดหลังจากใช้เครื่องหมายเท่ากับเป็นเนื้อหารวมถึงอัญประกาศใด ๆ และทั้งหมดที่อาจมีอยู่
- การเปรียบเทียบ IF จะได้รับการประเมินและขึ้นอยู่กับว่าเงื่อนไขเป็นจริงหรือเท็จบล็อกคำสั่งที่ขึ้นต่อกันของการแยกวิเคราะห์ที่เหมาะสมแล้วจะถูกประมวลผลเริ่มต้นด้วยเฟส 5
- คำสั่งย่อย IN ของคำสั่ง FOR ถูกวนซ้ำอย่างเหมาะสม
- หากนี่เป็น FOR / F ที่วนซ้ำเอาต์พุตของบล็อกคำสั่งดังนั้น:
- ส่วนคำสั่ง IN ถูกดำเนินการในกระบวนการ cmd.exe ใหม่ผ่านทาง CMD / C
- บล็อกคำสั่งต้องผ่านกระบวนการแยกวิเคราะห์ทั้งหมดในครั้งที่สอง แต่ครั้งนี้ในบริบทบรรทัดคำสั่ง
- ECHO จะเริ่มทำงานและการขยายที่ล่าช้ามักจะเริ่มต้นที่ปิดใช้งาน (ขึ้นอยู่กับการตั้งค่ารีจิสทรี)
- การเปลี่ยนแปลงสภาพแวดล้อมทั้งหมดที่ทำโดยบล็อกคำสั่ง IN clause จะหายไปเมื่อกระบวนการ child cmd.exe สิ้นสุดลง
- สำหรับการทำซ้ำแต่ละครั้ง:
- มีการกำหนดค่าตัวแปร FOR
- บล็อกคำสั่ง DO ที่แจงแล้วจะถูกประมวลผลแล้วเริ่มต้นด้วยเฟส 4
- GOTO ใช้ตรรกะต่อไปนี้เพื่อค้นหา: label
- ป้ายกำกับจะถูกแยกวิเคราะห์จากโทเค็นอาร์กิวเมนต์แรก
- สแกนสคริปต์สำหรับการเกิดขึ้นของฉลากถัดไป
- การสแกนเริ่มต้นจากตำแหน่งไฟล์ปัจจุบัน
- หากถึงจุดสิ้นสุดของไฟล์การสแกนจะวนกลับไปที่จุดเริ่มต้นของไฟล์และไปยังจุดเริ่มต้นเดิม
- การสแกนจะหยุดลงเมื่อพบป้ายกำกับครั้งแรกและตัวชี้ไฟล์ถูกตั้งค่าเป็นบรรทัดตามป้ายกำกับทันที การดำเนินการของสคริปต์ดำเนินการต่อจากจุดนั้น โปรดทราบว่า GOTO จริงที่ประสบความสำเร็จจะยกเลิกบล็อกโค้ดใด ๆ ที่ถูกแยกวิเคราะห์ทันทีรวมถึง FOR ลูป
- หากไม่พบฉลากหรือโทเค็นฉลากหายไป GOTO จะล้มเหลวข้อความแสดงข้อผิดพลาดจะถูกพิมพ์และสแตกการโทรจะปรากฏขึ้น สิ่งนี้ทำหน้าที่เป็น EXIT / B ได้อย่างมีประสิทธิภาพยกเว้นคำสั่งแยกวิเคราะห์ใด ๆ ในบล็อกคำสั่งปัจจุบันที่ติดตาม GOTO จะยังคงทำงาน แต่ในบริบทของ CALLer (บริบทที่มีอยู่หลังจาก EXIT / B)
- ดูhttps://www.dostips.com/forum/viewtopic.php?f=3&t=3803สำหรับคำอธิบายที่แม่นยำยิ่งขึ้นของกฎที่ใช้สำหรับการแยกวิเคราะห์ป้ายกำกับ
- RENAME และ COPY ยอมรับทั้ง wildcard สำหรับเส้นทางต้นทางและปลายทาง แต่ไมโครซอฟท์ทำงานที่ยอดเยี่ยมในการบันทึกสัญลักษณ์การทำงานของสัญลักษณ์แทนโดยเฉพาะอย่างยิ่งสำหรับเส้นทางเป้าหมาย สามารถพบชุดกฎกฎที่เป็นประโยชน์ได้ที่คำสั่ง Windows RENAME ตีความสัญลักษณ์แทนได้อย่างไร
- 7.2 - เรียกใช้การเปลี่ยนแปลงโวลุ่ม - อื่น ๆ ถ้าโทเค็นคำสั่งไม่ได้เริ่มต้นด้วยอัญประกาศมีความยาวสองตัวอักษรอย่างแน่นอนและตัวที่สองคือโคลอนจากนั้นเปลี่ยนโวลุ่ม
- โทเค็นการโต้แย้งทั้งหมดจะถูกละเว้น
- หากไม่พบปริมาณที่ระบุโดยอักขระตัวแรกให้ยกเลิกด้วยข้อผิดพลาด
- โทเค็นคำสั่งของ
::
จะส่งผลให้เกิดข้อผิดพลาดยกเว้นว่าใช้ SUBST เพื่อกำหนดระดับเสียงสำหรับ::
หากใช้ SUBST เพื่อกำหนดระดับเสียงสำหรับ::
ปริมาณจะถูกเปลี่ยนมันจะไม่ถูกใช้เป็นป้ายกำกับ
- 7.3 - ดำเนินการคำสั่งภายนอก - ลองพยายามใช้คำสั่งเป็นคำสั่งภายนอก
- หากอยู่ในโหมดบรรทัดคำสั่งและคำสั่งที่ไม่ได้ยกมาและไม่ได้เริ่มต้นด้วยข้อกำหนดปริมาณพื้นที่สีขาว,
,
, ;
, =
หรือ+
แล้วทำลายคำสั่ง token ที่เกิดขึ้นครั้งแรกของ<space>
,
;
หรือ=
และย่อหน้าที่เหลือที่จะโต้แย้งโทเค็น (s)
- หากอักขระตัวที่สองของโทเค็นคำสั่งเป็นเครื่องหมายโคลอนให้ตรวจสอบปริมาณที่ระบุโดยอักขระตัวที่หนึ่งที่สามารถพบได้
หากไม่พบปริมาณให้ยกเลิกด้วยข้อผิดพลาด
- หากอยู่ในโหมดชุดและคำสั่งโทเค็นเริ่มต้นด้วย
:
แล้วข้ามไป 7.4
หมายเหตุว่าถ้าโทเค็นฉลากเริ่มต้นด้วย::
แล้วนี้จะไม่สามารถเข้าถึงได้เพราะขั้นตอนก่อนหน้าจะมีการยกเลิกด้วยข้อผิดพลาดเว้นแต่ SUBST ::
ถูกนำมาใช้ในการกำหนดปริมาณสำหรับ
- ระบุคำสั่งภายนอกเพื่อดำเนินการ
- นี่เป็นกระบวนการที่ซับซ้อนที่อาจเกี่ยวข้องกับไดรฟ์ข้อมูลปัจจุบันไดเรกทอรีปัจจุบันตัวแปร PATH ตัวแปร PATHEXT และหรือการเชื่อมโยงไฟล์
- หากไม่สามารถระบุคำสั่งภายนอกที่ถูกต้องให้ยกเลิกด้วยข้อผิดพลาด
- หากอยู่ในโหมดบรรทัดคำสั่งและคำสั่งโทเค็นเริ่มต้นด้วย
:
แล้วข้ามไป 7.4
ทราบว่านี้เป็นถึงไม่ค่อยเพราะขั้นตอนก่อนหน้าจะมีการยกเลิกด้วยข้อผิดพลาดเว้นแต่โทเค็นคำสั่งเริ่มต้นด้วย::
และ SUBST ถูกนำมาใช้ในการกำหนดปริมาณการหา::
และ โทเค็นคำสั่งทั้งหมดเป็นพา ธ ที่ถูกต้องไปยังคำสั่งภายนอก
- 7.3.exec - ดำเนินการคำสั่งภายนอก
- 7.4 - ละเว้นฉลาก -
:
ไม่สนใจคำสั่งและข้อโต้แย้งทั้งหมดถ้าโทเค็นคำสั่งเริ่มต้นด้วย
กฎในข้อ 7.2 และ 7.3 อาจป้องกันไม่ให้ฉลากถึงจุดนี้
ตัวแยกวิเคราะห์บรรทัดคำสั่ง:
ทำงานเหมือน BatchLine-Parser ยกเว้น:
ขั้นตอนที่ 1) การขยายเปอร์เซ็นต์:
- ไม่มี
%*
, %1
ฯลฯ การขยายตัวของการโต้แย้ง
- หาก var ไม่ได้ถูกกำหนดไว้
%var%
จะไม่มีการเปลี่ยนแปลง
%%
ไม่มีการจัดการพิเศษของ หาก var = เนื้อหาแล้วขยายไปยัง%%var%%
%content%
เฟส 3) สะท้อนคำสั่งที่แยกวิเคราะห์
- สิ่งนี้ไม่ถูกดำเนินการหลังจากเฟส 2 ซึ่งจะดำเนินการหลังจากเฟส 4 สำหรับบล็อกคำสั่ง FOR DO เท่านั้น
ขั้นตอนที่ 5) การขยายล่าช้า:เฉพาะเมื่อเปิดใช้งานการหน่วงเวลาล่าช้าเท่านั้น
- หาก var ไม่ได้ถูกกำหนดไว้
!var!
จะไม่มีการเปลี่ยนแปลง
ขั้นตอนที่ 7) ดำเนินการคำสั่ง
- ความพยายามในการโทรหรือ GOTO a: ฉลากทำให้เกิดข้อผิดพลาด
- ดังที่มีการบันทึกไว้แล้วในเฟส 7 ฉลากที่ดำเนินการอาจส่งผลให้เกิดข้อผิดพลาดภายใต้สถานการณ์ต่างๆ
- ป้ายกำกับที่ดำเนินการเป็นชุดอาจทำให้เกิดข้อผิดพลาดได้หากเริ่มต้นด้วย
::
- ป้ายกำกับที่ดำเนินการบรรทัดคำสั่งมักจะทำให้เกิดข้อผิดพลาด
แยกค่าจำนวนเต็ม
มีบริบทต่าง ๆ มากมายที่ cmd.exe แยกวิเคราะห์ค่าจำนวนเต็มจากสตริงและกฎไม่สอดคล้องกัน:
SET /A
IF
%var:~n,m%
(การขยายสตริงย่อยตัวแปร)
FOR /F "TOKENS=n"
FOR /F "SKIP=n"
FOR /L %%A in (n1 n2 n3)
EXIT [/B] n
รายละเอียดสำหรับกฎเหล่านี้สามารถดูได้ที่กฎสำหรับวิธีแยกวิเคราะห์หมายเลข CMD.EXE
สำหรับทุกคนที่ต้องการปรับปรุงกฎการแยกวิเคราะห์ cmd.exe มีหัวข้อการอภิปรายในฟอรัม DosTipsที่สามารถรายงานปัญหาและข้อเสนอแนะได้
หวังว่าจะช่วย
Jan Erik (jeb) - ผู้แต่งดั้งเดิมและผู้ค้นพบ phases
Dave Benham (dbenham) - เนื้อหาและการแก้ไขเพิ่มเติมมากมาย