การใช้สัญลักษณ์แทนด้วยคำสั่ง rmdir หรือ rd


40

สมมติว่ามีบางโฟลเดอร์ในD:ไดรฟ์:

D:\Air
D:\Abonden
D:\All
D:\Whatever

ฉันต้องการลบโฟลเดอร์ทั้งหมดที่ขึ้นต้นด้วย "A" (รวมถึงโฟลเดอร์ย่อยและไฟล์ทั้งหมด) ฉันลองคำสั่งนี้:

rmdir D:\A* /s /q

ฉันได้รับข้อผิดพลาดแม้ว่า :(

ชื่อไฟล์ชื่อไดเรกทอรีหรือไวยากรณ์ฉลากปริมาณไม่ถูกต้อง

delคำสั่งทำงานร่วมกับ*แต่ฉันต้องการที่จะลบโฟลเดอร์ได้เป็นอย่างดี
มีวิธีการผ่านrmdirคำสั่งหรือไม่


2
ความสม่ำเสมอและสามัญสำนึกไม่เคยเล่นในการพัฒนาเชลล์คำสั่งของ Windows หรือ DOS ส่วนที่น่าเศร้าคือมีระบบรุ่นออกมาเมื่อเปลือกเหล่านี้ได้รับการพัฒนาซึ่งจะมีผลต่อการออกแบบที่ชาญฉลาด แน่นอนว่าเชลล์เป็นเพียงตัวอย่างหนึ่งของกระบวนการคิดที่น่ากลัวและไม่มีอยู่ที่เข้ามาตบขยะด้วยกัน - ฉันหวังว่าฉันจะบอกคุณได้ว่าฉันคิดอย่างไรฮ่าฮ่า
Rick O'Shea

คำตอบ:


33
cd c:\temp
for /f %i in ('dir /a:d /s /b A*') do rd /s /q %i

ใช้สิ่งนี้เพื่อทดสอบว่า:

for /f %i in ('dir /a:d /s /b A*') do echo rd /s /q %i

สิ่งนี้จะไพพ์คำสั่งที่จะใช้ในพรอมต์คำสั่งและช่วยให้คุณเห็นสิ่งที่เกิดขึ้น

โปรดจำไว้ว่านี่จะเป็นการค้นหาโฟลเดอร์ย่อยเช่น "C: \ temp \ jjj \ aaa" และจะลบโฟลเดอร์ aaa หากคุณต้องการให้ดูที่โฟลเดอร์ระดับบนสุด "C: \ temp \ aaa" ให้ลบ"/s"คำสั่งออกจากคำสั่ง

กุญแจสำคัญในการนี้คือ A * ซึ่งคุณจะใส่ในสตริงการค้นหาของคุณ นี้จะยอมรับสัญลักษณ์เช่นaaa*, aaa*และ*aaa*ถ้าคุณอยากให้มันเป็น


ตามที่เป็นอยู่คำสั่งจะแตกหากชื่อพา ธ / โฟลเดอร์มีอักขระเว้นวรรค
and31415

1
เราสามารถเพิ่ม "ถ้าไม่มี EXO goto EFO" สำหรับ A * ได้หรือไม่?
serdar

3
สิ่งนี้จะทำงานได้หากเส้นทางมีช่องว่างอักขระ: สำหรับ / f "delims ="% i ใน ('dir / a: d / s / b A *') ทำ rd / s / q "% i"
Luis Cantero - MSFT

5
ฉันจะเช่นเดียวกับการเพิ่มว่าถ้าทำงานนี้จากภายในแฟ้มแบทช์แล้วคุณจะต้องใช้สัญญาณสองเปอร์เซ็นต์เพื่อให้คำสั่งจะกลายเป็นfor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
เฟร็ดเซน

ไม่จำเป็นต้องใช้ธง 'w / ย่อย' สองครั้ง :)
lunicon

25

การลบโฟลเดอร์โดยใช้สัญลักษณ์แทน

กระบวนการrmdir/ rdคำสั่งเพียงอย่างเดียวไม่สนับสนุนอักขระตัวแทน (นั่นคือ*และ?) คุณสามารถแก้ไขข้อ จำกัด นี้ได้ด้วยการล้อมforรอบ

ตัวอย่างการใช้งาน

for /d %G in ("X:\A*") do rd /s /q "%~G"

หมายเหตุเมื่อคุณลบไฟล์และโฟลเดอร์คุณอาจต้องการแทนที่rdคำสั่งด้วยคำสั่งechoก่อน วิธีนี้คุณสามารถมั่นใจได้ว่าทุกสิ่งที่ไม่ควรถูกลบจะเป็นจริง

หลายรูปแบบ

เพื่อที่จะลบหลาย ๆ โฟลเดอร์ที่ตรงกับรูปแบบที่แตกต่างกันไวยากรณ์ไม่แตกต่างกันมากเกินไป เมื่อ @dbenham ชี้อย่างถูกต้องคำสั่งหนึ่งบรรทัดก็เพียงพอแล้ว คุณยังสามารถระบุเส้นทางอื่น:

for /d %G in ("X:\A*","Y:\Whatever\B*","Z:\C?D") do rd /s /q "%~G"

โบนัส - ตรวจสอบการมีอยู่ของโฟลเดอร์

ในกรณีที่คุณต้องการตรวจสอบว่ามีโฟลเดอร์เฉพาะอยู่หรือไม่คุณสามารถใช้คำสั่งต่อไปนี้:

dir /b /a:d "X:\A*" >nul 2>&1 && echo Folders exist. || echo No folders found.

อ่านเพิ่มเติม


เราสามารถเพิ่ม "ถ้าไม่มี EXO goto EFO" สำหรับ A * ได้หรือไม่?
serdar

ตัวอย่างเช่นเราสมมติว่าไม่มีโฟลเดอร์ที่ขึ้นต้นด้วยตัวอักษร A ดังนั้นคำสั่งจะต้องเป็น B * ฉันไม่รู้ว่าฉันสามารถอธิบายได้หรือไม่ :(
serdar

1
+1 จากฉัน ฉันไม่เข้าใจการลงคะแนนเสียง แม้ว่าคุณสามารถทำหลายรูปแบบด้วยคำสั่งที่ง่ายFOR /Dและ เพียงแค่ใช้FOR /D /R in( "A*" "B*" "C?D" )
dbenham

1
ที่จริงแล้วคุณต้องการ/Rตัวเลือกเนื่องจากโฟลเดอร์ย่อยที่ตรงกับรูปแบบนั้นอาจอยู่ภายใต้พาเรนต์ที่ไม่มี
dbenham

5
คำเตือน: หากคุณต้องการใช้โซลูชันนี้ในไฟล์. bat คุณต้องใช้ %% G แทน% G ดูที่นี่
ValarDohaeris

18

ยังไม่มีใครบอก OP เกี่ยวกับการปลอมแปลงได้อย่างไร!

forfiles /P D:\ /M A* /C "cmd /c if @isdir==TRUE rmdir /s /q @file"

/ P คือชื่อพา ธ - ตำแหน่งที่การค้นหาเริ่มต้น
/ M เป็นหน้ากากค้นหาค้นหาไฟล์ที่ขึ้นต้นด้วย A
/ C คือคำสั่งให้ดำเนินการ
/ S เป็นโฟลเดอร์ย่อยแบบเรียกซ้ำ (ไม่รวมที่นี่เพราะ op ไม่ได้ถาม)

2
นี่คือคำตอบที่ดีควรเป็นที่ยอมรับ
eacousineau

1
ทางออกที่ดีมากและอธิบายได้ดี
Andreas

คำตอบที่เป็นประโยชน์: D แต่ IMO for /dตามคำตอบในand31415นั้นทั้งสะอาดและมีประสิทธิภาพมากกว่า
Superole

12

adn31415 คำตอบนั้นถูกต้อง แต่จะแตกถ้าคุณใส่มันลงในชุดหรือสคริปต์ cmd ฉันกระแทกหัวของฉันหลายชั่วโมงจนกระทั่งฉันคิดออกว่านี่เป็นวิธีที่คุณใช้

ในหน้าต่างคำสั่ง DOS:

for /d %G in ("X:\A*") do rd /s /q "%~G"

ใน Batch หรือ cmd script:

for /d %%G in ("X:\A*") do rd /s /q "%%~G"

หากคุณต้องการใส่ลงในไฟล์ ".bat" หรือไฟล์ ".cmd" คุณจะต้องเพิ่มอักขระ "%" เป็นสองเท่า


3
คุณประหยัดเวลาของฉันสำหรับสคริปต์แบทช์!
Tuan

ไม่มีปัญหาเพื่อน :) นั่นเป็นเหตุผลที่โพสต์คำตอบเพราะฉันรู้ว่ามันไม่ชัดเจนและมีผู้คนมากมายที่เข้ามาหามัน
Sam B

เราสามารถเพิ่มการแยกที่จะไม่ถูกลบได้หรือไม่?
serdar

SET / P PC = ป้อน IP หรือชื่อโฮสต์สำหรับ / d %% a ใน ("\\% PC% \ D $ \ A *. *") ทำ rd / s / q "%% a" scritpt นี้ทำงานได้อย่างถูกต้อง ?
serdar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.