วิธีการใช้งานคำสั่ง windows นี้: echo% path:; = & echo.%


23

กำลังหาวิธีการแก้ปัญหาในการพิมพ์ pathes ภายในpathตัวแปรในหน้าต่าง Command-Line ฉันมาถึงนี้การแก้ปัญหา คำตอบคือคำสั่งนี้:

echo %path:;=&echo.%

ตอนนี้ฉันสงสัยว่ามันทำงานอย่างไร


คำเตือน:echo.อาจจะไม่ทำงาน
user202729

คำตอบ:


22

นั่นเป็นทางออกที่น่าสนใจที่ฉันไม่เคยเห็นมาก่อน ให้ฉันพยายามอธิบาย:

  1. echo %path%หากต้องการพิมพ์เส้นทางทั้งหมดใช้ นี้จะพิมพ์ไดเรกทอรีทั้งหมดในบรรทัดเดียวคั่นด้วยเครื่องหมายอัฒภาค ( ;)
  2. ในการค้นหา / แทนที่สตริงในตัวแปรใช้%path:a=b%ซึ่งจะแทนที่aอักขระทั้งหมดด้วยb
  3. echo. ถูกใช้เพื่อพิมพ์บรรทัดใหม่
  4. &ใช้เพื่อแยกคำสั่งเช่นecho line1&echo line2จะพิมพ์สองบรรทัด
  5. มีผลอัฒภาคในเส้นทางจะถูกแทนที่ด้วยคำสั่งเพื่อพิมพ์บรรทัดใหม่ หรืออาจตีความว่า 'แทนที่;ด้วยไม่มีอะไรเลยแล้วพิมพ์บรรทัดใหม่' ฉันไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนี้ดังนั้นมันเป็นเพียงการตีความของฉัน ตรงไปตรงมาฉันไม่ได้รู้ว่าเป็นไปได้ แต่มีคุณไป UPDATEตีความของฉันของขั้นตอนนี้ดูเหมือนว่าจะออกไปและจะมีการอธิบายที่ดีขึ้นโดยwizzwizz4

สิ่งที่เป็นสัญญาณ %% ใช้สำหรับสามารถ; T เราบอกecho path? %% ใช้สำหรับตัวแปรอย่างไร
yekanchi

1
ใช่ถูกต้องแล้วจะใช้เพื่อรับค่าของตัวแปร ยกตัวอย่างเช่น: แล้วset greeting=Hello เกิดความecho %greeting%สับสนPATHเกิดขึ้นกับทั้งคำสั่งและตัวแปรดังนั้นการพิมพ์คำสั่งpathหรือecho %path%จะให้ผลลัพธ์เดียวกัน
Berend

ไวยากรณ์นี้เรียกว่าอะไร มันคือ regex? หรือสิ่งที่ใช้ใน windows CMD เท่านั้น
yekanchi

ฉันไม่แน่ใจว่ามีชื่อนี้หรือไม่มันเป็นเพียงวิธีการทำงานของตัวแปรใน DOS ภาษาอื่นเช่นทุบตีใช้$PATHเป็นต้น
Berend

2
นี่คืออะไรจะทำอย่างไรกับ DOS, Berend; และecho.ไม่ใช่ "คำสั่งเพื่อพิมพ์บรรทัดใหม่" นี่คือแปลคำสั่งของ Microsoftสำหรับ Windows NT, cmd; และecho.เป็นเพียงคำสั่งที่จะพิมพ์เป็นองค์ประกอบเส้นทางการสร้างความมั่นใจว่าถ้าองค์ประกอบเส้นทางจะว่างก็ไม่ได้สลับไปที่อื่น ๆechoการทำงานของ ครั้งแรกที่echoควรจะเป็นจริงecho.เกินไป
JdeBP

30

นี่คือการใช้การทดแทนตัวแปรบรรทัดคำสั่ง %path:;=&echo.%หมายถึง " %path%แต่แทนที่ทั้งหมด;ด้วย&echo." ซึ่งหมายความว่าด้วยset path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

กลายเป็น:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

เนื่องจาก&เป็นตัวคั่นคำสั่งจึงเท่ากับ:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

เนื่องจาก quirks ของ DOS Batch echo.เหมือนกันecho ยกเว้นเมื่อไม่มีอะไรเกิดขึ้นหลังจากนั้น หากเป็นเช่นนั้นมันจะไม่พิมพ์อะไรเลยแทนที่จะบอกคุณว่าECHOเปิดหรือปิดอยู่ สิ่งนี้จะทำให้ผลลัพธ์:

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

จริง ๆ ควรecho.%path:;=&echo.%พิจารณากรณีที่%PATH%เริ่มต้นด้วย a ;แต่คำสั่งนี้ค่อนข้างฉลาดอยู่แล้ว


การเดินทางเข้า detalias ละเอียดจริงๆ ควรจะนำมาใช้แทนecho( echo.นี่เป็นเพราะecho.อาจมีปัญหาเมื่อคุณมีไฟล์ชื่อechoและช้าเพราะมันต้องตรวจสอบดิสก์ ( %CD%และฉันคิดว่าทั้งหมด%PATH%) ทุกครั้งที่มันทำงาน (ฉันไม่มีสำเนา Windows ดังนั้นฉันจึงไม่สามารถตรวจสอบด้วยตนเองได้มันเป็นเพียง%CD%หรือที่ใดก็ตาม%PATH%ที่การปรากฏตัวของechoไฟล์จะส่งผลกระทบecho.และสิ่งนี้จะทำอย่างไร)


นี่เป็นพฤติกรรมที่ยาวนานของล่ามคำสั่ง Microsoft / IBM ในระบบปฏิบัติการหลายระบบและไม่เฉพาะเจาะจงกับสคริปต์แบบแบตช์ ดังที่ฉันได้บันทึกไว้ที่superuser.com/a/310157/38062ปีที่แล้วมีอักขระเครื่องหมายวรรคตอนหลายตัวนอกเหนือจากช่องว่างที่นับว่าเป็นอักขระการยกเลิกชื่อคำสั่ง
JdeBP

@JdeBP ฉันคิดว่าหนึ่งในนั้นมีประสิทธิภาพมากขึ้นecho)แต่ฉันจำไม่ได้จริงๆ ;-(
wizzwizz4

3
echo.เป็นสิ่งที่ผู้คนเคยหมุนเวียนกันมากที่สุดเมื่อหลายปีก่อน มันเป็นหนึ่งในหนังสือหลายเล่ม ประสิทธิภาพไม่ใช่ปัญหา พฤติกรรมแปลกประหลาดเมื่อมีไฟล์ต่าง ๆ เกิดขึ้นคือ เมื่อฉันเขียนการแทนที่ 32 บิตสำหรับ 16 บิตcmdใน OS / 2 การแตกชื่อคำสั่งที่อักขระเครื่องหมายวรรคตอนและพฤติกรรมการแยกวิเคราะห์ที่ผิดปกติอย่างมากนี้เป็นหนึ่งในสิ่งที่ฉันตั้งใจไม่ได้ทำซ้ำและฉันใส่เอกสารไว้ รายการความแตกต่าง ฉันสร้างechodotคำสั่งภายนอกแทนซึ่งสามารถใช้นามแฝงได้echo.ตามต้องการ
JdeBP

@JdeBP ฟังดูน่าสนใจจริงๆ! คุณคิดว่าคุณสามารถบันทึกเอกสารบางส่วนได้หรือไม่?
wizzwizz4

หากคุณติดตามลิงก์ความคิดเห็นต่าง ๆ คุณจะพบกับข้อความฟอรัมบุคคลที่สามซึ่งecho(เป็นรุ่นที่ปลอดภัยเท่านั้น
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.