ตามที่บางคำตอบอื่น ๆ / หมายเหตุความคิดเห็นความคิดที่ว่าจะต้องมีช่องว่างหลังจากคำสั่งไม่ถูกต้อง ตัวอย่างที่รู้จักกันดีคือคุณสามารถพิมพ์ไปข้างหน้าสแลชหลังจากคำสั่งโดยไม่จำเป็นต้องมีช่องว่างก่อน
อย่างไรก็ตามมีพฤติกรรมอื่นที่เข้าใจได้น้อยกว่าและอนุญาตให้ " cd..
" ที่คุณถามถึงอยู่ด้วย พฤติกรรมนี้ยังช่วยให้ " cd\
" สามารถทำงานได้
พฤติกรรมที่คุณอธิบายนั้นสอดคล้องกันสำหรับคำสั่งทั้งหมดภายในตัวแปลบรรทัดคำสั่ง หากคุณมีสัญลักษณ์บางอย่างรวมถึงเครื่องหมายจุดต่อเวลาสแลชหรือแบ็กสแลชจากนั้นอักขระก่อนหน้าจะถูกตรวจสอบเพื่อดูว่าเป็นคำสั่งที่อยู่ภายในเชลล์ "command line interpreter" หรือไม่ (CMD.EXE หรือ COMMAND.COM ก่อนหน้า )
สิ่งนี้อาจทำได้ก่อนตรวจสอบว่าคำนั้นอาจอ้างถึงไฟล์หรือไดเรกทอรีย่อย นั่นเป็นความจริงสำหรับcd
คำสั่ง อนาถาเมื่อสร้างตัวอย่างฉันพบว่าสิ่งนี้ไม่ได้เกิดขึ้นกับcopy
คำสั่งดังนั้นผลลัพธ์ไม่สอดคล้องกัน: พวกเขาไม่จำเป็นต้องเหมือนกันกับคำสั่งภายในทั้งหมด ฉันไม่ได้ทำการค้นหาเพื่อเปรียบเทียบบรรทัดคำสั่งอื่น (มาก) del
และdir
ดังนั้นฉันขอแนะนำให้ระมัดระวังอย่างยิ่งหากคุณพยายามที่จะพึ่งพาสิ่งที่เกิดขึ้นโดยไม่มีที่ว่าง
ตอนนี้คำถามก็ถามเกี่ยวกับคำสั่งecho : นี่เป็นข้อยกเว้นที่ผิดปกติซึ่งฉันคิดว่าecho.
ผู้เชี่ยวชาญ DOS เป็นที่รู้จักกันดี นี่อาจเป็นเอกสาร พฤติกรรมอย่างน้อยที่สุดก็ในCMDของ Win7 คือถ้าคำสั่งเริ่มต้นด้วย " echo.
" ดังนั้นช่วงแรกจะถูกละเว้น ดังนั้น " echo..hi
" จะเปลี่ยนเป็นผลลัพธ์ของ " .hi
" เหตุผลนี้คือเพื่อให้ " echo.
" สามารถใช้พิมพ์บรรทัดว่างได้ ในทางตรงกันข้ามกับ Unix คุณสามารถทำได้ง่ายๆโดยเรียกใช้echo
คำสั่ง "" ด้วยตัวเอง อย่างไรก็ตามใน DOS การรันecho
คำสั่ง "" ด้วยตัวเองจะแสดงผลการตั้งค่า " echo " ปัจจุบัน ในทำนองเดียวกัน DOS ถือว่า " Echo *Off*
" และ "Echo *On*
"เป็นค่าพิเศษที่เปลี่ยนการตั้งค่าเสียงสะท้อนในปัจจุบันหากคุณต้องการพิมพ์คำว่า" Off
"ดังนั้น" Echo.Off
"จะทำการหลอกลวง (อย่างน้อยก็ด้วยล่ามบรรทัดคำสั่งCMDของ Microsoft รุ่นล่าสุด)
อย่างน้อยecho
คำสั่งก็มีคำอธิบายที่สมเหตุสมผล สำหรับคำสั่งที่เหลือฉันเคยคิดว่าคำสั่งภายในมีลำดับความสำคัญ อย่างไรก็ตามเมื่อฉันพยายามทำการทดสอบบางอย่างฉันพบว่ามันค่อนข้างไม่สอดคล้องกัน ฉันสาธิตสิ่งนี้ผ่านตัวอย่างที่บันทึกไว้ที่นี่
นี่คือตัวอย่างบางส่วน. ฉันใช้พรอมต์คำสั่งยกระดับเพื่อที่ UAC จะไม่เข้าใจเกี่ยวกับตัวฉันที่เขียนไปยังไดเรกทอรีราก สิ่งนี้ทำกับ CMD.EXE ของ Microsoft Windows 7 ฉันสงสัยว่าพฤติกรรมอาจแตกต่างจากเวอร์ชั่นอื่นเช่น COMMAND.COM จากเวอร์ชั่นเก่าของ MS-DOS หรือซอฟต์แวร์ที่ออกโดย บริษัท อื่น (COMMAND.COM ของ DR-DOS)
(คำตอบนี้ค่อนข้างยาวอยู่แล้วดังนั้นฉันไม่ได้รวมคำสั่งในการทำความสะอาดทั้งหมดที่ฉันทำในระบบไฟล์ของฉันมีการทำความสะอาดเล็กน้อย แต่ไม่มาก)
นี่คือตัวอย่างที่พิสูจน์ว่าคำสั่งภายในสร้างลำดับความสำคัญ (ฉันยังแสดงให้เห็นถึงความสามารถที่ค่อนข้างน้อยในการใช้เครื่องหมายโคลอนคู่เพื่อแสดงความคิดเห็นได้อย่างมีประสิทธิภาพซึ่งทำงานได้ดีในไฟล์แบทช์โดยทางเทคนิคในไฟล์แบทช์จะได้รับการประมวลผลเป็นป้ายกำกับที่ GOTO ไม่สามารถเข้าถึงได้ กำลังเร็วกว่าคำสั่ง REM)
C: \ something> md cd
C: \ something> echo echo subdir >> cd \ a.bat
C: \ something> md \ a
C: \ something> . \ cd \ a.bat
subdir
C: \ something> :: ที่วิ่งออกมาจากส่วนย่อย
C: \ something> cd \ a
C: \ a> :: ที่เปลี่ยนไดเรกทอรีปัจจุบันของฉันดังนั้นcdจึงมีความสำคัญกว่า
อัปเดต:จากการทดลองต่อไปฉันพบว่าคำสั่งcdภายในจะมีความสำคัญเหนือกว่าระบบไฟล์หากไดเรกทอรีที่ระบุไม่รวมจุด ดังนั้นถ้าคุณมีไดเรกทอรีชื่อ " a.bat " คุณก็สามารถเรียกใช้ " **cd\a.bat**
" และไฟล์แบตช์จะทำงาน
การสำรวจพฤติกรรมที่ใช้กันทั่วไปน้อยลง (เนื่องจากไดเรกทอรีส่วนใหญ่อาจไม่มีจุดใน) ทำให้ฉันปรับปรุงการค้นพบของฉัน ปรากฎว่าคำสั่งcdทำตัวคล้ายกับคำสั่งcopyมากกว่าที่ฉันคิดไว้ในตอนแรก
แม้ว่าในตอนแรกฉันคิดว่าคำสั่งcdและcopyต่างกัน แต่ตอนนี้ฉันก็เข้าใจแล้วว่าเป็นเพราะรูปแบบของชื่อที่ฉันให้มา แต่ถึงกระนั้นฉันได้ตรวจสอบผลลัพธ์ก่อนหน้าของฉันและกำหนดว่าการทดสอบเอกสารก่อนหน้าของฉันช่วยในการแสดงความแตกต่างระหว่างสิ่งที่เกิดขึ้นเมื่อชื่อมีระยะเวลาและนามสกุลและเมื่อมันไม่ ดังนั้นฉันยังคงรวมสิ่งที่พบเก่าของฉันด้านล่าง (ส่วนใหญ่ไม่เปลี่ยนแปลง แต่มีการปรับปรุงเล็กน้อยบางอย่างดังนั้นสิ่งที่ฉันพูดมีความถูกต้อง)
นี่คือตัวอย่างที่แสดงให้เห็นถึงการคัดลอกที่มีพา ธ เต็มไม่ใช้ลำดับความสำคัญเดิม (นิยมคำสั่งภายใน) เป็นcdเมื่อไม่มีการใช้ส่วนขยาย:
C: \ something> echo echo root >> \ try.bat
C: \ something> md copy
C: \ something> ไดเร็กทอรีย่อย echo echo >> copy \ try.bat
C: \ some > . \ copy \ try.bat ทำงานจาก ไดเรกทอรีย่อยไดเรกทอรี
ย่อย
C: \ something> copy \ try.bat
ไดเรกทอรีย่อย
C: \ something> :: Huh? ทำไมจึงไม่ลบล้างและเรียกใช้จากรูท
C: \ something> :: เห็นได้ชัดว่าคำสั่งคัดลอกภายในไม่มีความสำคัญมากกว่าการตรวจสอบไดเรกทอรีย่อยและชื่อไฟล์แบบเต็ม (แม้ว่าคำสั่งcdภายในจะมีลำดับความสำคัญเมื่อไดเรกทอรีไม่มีส่วนขยาย)
C: \ something> ::
C: \ บางอย่าง>:: การทดสอบอื่น: ฉันสามารถเพิ่มช่วงเวลาที่ไร้ประโยชน์ที่ท้าย
C: \ something> . \ copy .. \ try.bat
ไดเรกทอรีย่อย
C: \ something> :: โอเคเยี่ยมมาก แต่นี่จะไม่ตรวจสอบไดเรกทอรีย่อย:
C: \ something> copy .. \ try.bat
1 ไฟล์ที่คัดลอก
C: \ something> :: ที่รันคำสั่ง copy ภายใน
การค้นพบครั้งแรกของฉันระบุว่าผลลัพธ์เหล่านี้แสดงให้เห็นว่าเชลล์บรรทัดคำสั่งให้ความสำคัญ:
- ไปยังระบบไฟล์ (แทนคำสั่งcopyภายใน) เมื่อระบุแบ็กสแลชทันทีหลังจากชื่อของคำสั่งภายใน
- ไปที่คำสั่งcdภายใน(แทนที่จะเป็นระบบไฟล์) เมื่อระบุแบ็กสแลชทันทีหลังชื่อของคำสั่งภายใน
- ไปยังคำสั่งcopyภายใน(แทนระบบไฟล์) เมื่อระบุจุดทันทีหลังจากชื่อของคำสั่งภายใน
สิ่งนี้แสดงให้เห็นอย่างชัดเจนว่าพฤติกรรมนั้นไม่สอดคล้องกันระหว่างคำสั่งcopy (พร้อมชื่อไฟล์แบบเต็มรวมถึงส่วนขยาย) และคำสั่งcd (โดยไม่มีนามสกุลเป็นส่วนหนึ่งของชื่อไดเรกทอรี) เมื่อใช้แบ็กสแลชคำสั่งcopy (พร้อมนามสกุลไฟล์แบบเต็ม) จะตรวจสอบระบบไฟล์ก่อน แต่คำสั่งcdจะไม่ (หากไดเรกทอรีไม่มีส่วนขยาย)
(อัปเดต: ตอนแรกฉันคิดว่าความไม่สอดคล้องกันนั้นขึ้นอยู่กับพฤติกรรมที่แตกต่างกันระหว่างโปรแกรมต่อมาฉันค้นพบว่ามีความไม่สอดคล้องกันอยู่ แต่เกิดจากพารามิเตอร์ที่ให้มาเพิ่มเติม)
ที่จริงแล้วแม้แต่สัญลักษณ์แสดงหัวข้อย่อยนั้นไม่ถูกต้องทั้งหมดแม้ว่าฉันจะดูเหมือนจะแสดงให้เห็นถึงสิ่งที่ฉันพูด ปัญหาคือรายการของสัญลักษณ์แสดงหัวข้อไม่แม่นยำพอที่จะแม่นยำอย่างสมบูรณ์ (ฉันปล่อยให้สิ่งต่าง ๆ ไม่แน่ชัดเพื่อให้สามารถเปรียบเทียบได้ง่ายและตรวจสอบได้ง่าย)
อย่างไรก็ตามเพื่อให้มีความแม่นยำมากขึ้นกระสุนแรกควรชี้ให้เห็นว่าเชลล์บรรทัดคำสั่งให้ความสำคัญ:
- กับระบบแฟ้ม (แทนภายในสำเนาคำสั่ง) เมื่อระบุเครื่องหมาย, และจากนั้นที่เหลือของเส้นทางที่เต็มขวาหลังจากชื่อของคำสั่งภายใน
ต่อไปนี้จะแสดงให้เห็นว่าทำไมฉันถึงสร้างความแตกต่าง:
C: \ ที่อื่น ๆ > echo UAC ต้องการระดับความสูงสำหรับบรรทัดนี้ >> \ needext
C: \ ที่อื่น ๆ > echo UAC ระดับความสูงที่จำเป็นสำหรับบรรทัดนี้ >> \ needext.bat
C: \ ที่อื่น ๆ > md. \ คัดลอก
C: \ ที่อื่น> echo @ Echo subdir >> copy \ needext.bat
C: \ ที่อื่น> . \ copy \ needext
subdir
C: \ ที่อื่น> copy \ needext.bat
subdir
C: \ ที่อื่น> คัดลอก \ needext
1 ไฟล์ (s)
C: \ ที่อื่น> :: UAC ยังต้องการสำหรับบรรทัดถัดไป
C: \ ที่อื่น> del \ needext
C: \ ที่อื่น> del \ needext.bat
(โปรดทราบว่าคำสั่งคัดลอกล่าสุดค้นหาไฟล์ชื่อ\ needextเนื่องจากมีการใช้คำสั่งคัดลอกภายในไฟล์\ needext.batถูกสร้างขึ้นเพื่อช่วยในการแสดงว่าบรรทัดคำสั่งที่รวมคำคัดลอกไม่เคยใช้.)
ณ จุดนี้ฉันสร้างความไม่สอดคล้องกัน (ด้วยพฤติกรรมของคำสั่งcopy ) เมื่อมีการใช้แบ็กสแลช ...
ต่อไปฉันจะแสดงให้เห็นว่ามีความสอดคล้องกันระหว่างคำสั่งเหล่านี้ (ดังนั้นมีความสอดคล้อง ... เอ่อ ... บางครั้งเราอาจมีความมั่นคงไม่สอดคล้องกัน) สิ่งที่ฉันจะแสดงต่อไปคือคำสั่งcdทำตัวเหมือนคำสั่งคัดลอกเมื่อใช้จุด สำเนาคำสั่งใช้คำสั่งภายในและเพื่อไม่cdคำสั่ง
C: \ something> md. \ yetmore
C: \ something> cd. butmore
C: \ something \ yetmore> md. \ md
C: \ something \ yetmore> echo echo subdir >> md \ test.bat
C: \ something \ yetmore> . \ md. \ test
subdir
C: \ something \ yetmore> md. \ test
C: \ something \ yetmore> md. \ test
มีไดเรกทอรีย่อยหรือไฟล์. \ test อยู่แล้ว
C: \ something \ yetmore> :: ข้อผิดพลาดนั้นแสดงว่าเราเรียกใช้คำสั่งภายใน
C: \ something \ yetmore> md .. \ test
C: \ something \ yetmore> md. \ cd
C: \ something \ yetmore> copy. \ md cd
. \ md \ test.bat
1 ไฟล์ (s) คัดลอก
C: \ something \ yetmore> . \ cd. \ test
subdir
C: \ something \ yetmore> cd. \ test
C: \ something \ yetmore \ test> :: คำสั่งภายในทำงานร่วมกับหนึ่งช่วงเวลา
C: \ something \ yetmore \ ทดสอบ> cd ..
C: \ something \ yetmore> . \ cd .. \ test
subdir
C: \ something \ yetmore> cd .. \ test
C: \ something \ test> :: คำสั่งภายในยังมีลำดับความสำคัญเมื่อสองจุดคือ มือสอง
ดังนั้นในช่วงเซสชั่นการทดสอบครั้งแรกซึ่งส่วนใหญ่มุ่งเน้นไปที่คำสั่งcdและcopy (ด้วยการใช้งานเพิ่มเติมของmdและบิตของdel ) ครั้งเดียวที่เรามีระบบไฟล์ที่มีลำดับความสำคัญคือด้วยคำสั่งคัดลอกแล้ว ระบบไฟล์มีความสำคัญเมื่อใช้เส้นทางแบบเต็ม
หลังจากการตรวจสอบภายหลังฉันพบว่าคำสั่งcdยังให้ความสำคัญกับระบบไฟล์เมื่อใช้ส่วนขยาย อย่างน้อยนี่หมายความว่าคำสั่งภายในได้รับการปฏิบัติให้สอดคล้องกันมากขึ้น อย่างไรก็ตามมันก็หมายความว่าเราได้รับพฤติกรรมที่แตกต่างกันตามชื่อของวัตถุระบบไฟล์ (ไฟล์หรือไดเรกทอรี) ดูเหมือนว่าพฤติกรรมกำลังใช้ตรรกะภายในบางอย่างที่คลุมเครือจริงๆ ดังนั้นการนับการทำงานนี้เพื่อทำงานกับระบบปฏิบัติการที่แตกต่างกันจึงเป็นสิ่งที่ฉันคิดว่าไม่ปลอดภัยที่จะทำ