เราทำการทดลองเพื่อตรวจสอบไวยากรณ์ของสคริปต์ชุดงาน นอกจากนี้เรายังตรวจสอบความแตกต่างระหว่างแบทช์และโหมดบรรทัดคำสั่ง
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) - เนื้อหาและการแก้ไขเพิ่มเติมมากมาย