วิธีสร้างแบตช์ไฟล์ที่ลบโฟลเดอร์ทั้งหมดที่ชื่อว่า `bin` หรือ` obj` ซ้ำ?


31

ฉันต้องการลบbin& objโฟลเดอร์ทั้งหมดในโฟลเดอร์บนพีซีของฉัน ดังนั้นฉันคิดว่าไฟล์ชุดทำ แต่ฉันไม่ famaliar กับไฟล์ batching ใน Windows กรุณาช่วย.

[แก้ไข]

หลังจากพูดคุยกับผู้ใช้DMA57361ฉันถึงวิธีแก้ปัญหาปัจจุบัน (ยังคงมีปัญหาดูความคิดเห็นของเรา):

สร้างไฟล์. bat และวางคำสั่งด้านล่าง:

start for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"

หรือ

start for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s "%%d"

@ DMA57361: เมื่อฉันเรียกใช้สคริปต์ของคุณฉันได้รับข้อผิดพลาดด้านล่าง ความคิดใด ๆ

ข้อความแสดงแทน


@Nam - ทำไมคุณทำงานfor \/d \/r ...- ทำไมดับเบิล slashs แทนfor /d /r ...? และการรันเวอร์ชัน "เต็ม" ด้วย/qตอนท้าย - ตามที่ฉันระบุ - ลบทุกอย่างโดยไม่มีการเตือนดังนั้นจะไม่ส่งคืนผลลัพธ์ (กล่าวคือมันไม่ได้บอกคุณว่ามันทำงานได้เมื่อมีข้อผิดพลาด) คุณแน่ใจหรือไม่ว่า ทำงานข้างต้นไม่ทำงานอย่างถูกต้อง?
DMA57361

@ ไม่ใช่การทำงานนี้ก็ไม่เหมือนกัน - ในภาพที่คำสั่งของคุณเริ่มต้นด้วยfor / %d in และไม่for /d /r . %d in- คุณต้องใช้คำสั่งทั้งหมดด้านล่างแต่ละบิตมีฟังก์ชั่นที่แตกต่างกันและมีความสำคัญ
DMA57361

@Nam ขออภัยขอโทษคุณอย่างถูกต้องมันไม่ได้พิมพ์สวิทช์แรก ๆ ! อย่างไรก็ตามมันไม่ได้โยนข้อผิดพลาดนั้นและดูเหมือนว่าจะทำงานได้ถูกต้องสำหรับฉัน คุณได้ลองใช้คำสั่งจากบรรทัดคำสั่งแทนที่จะพยายามเรียกใช้จากภายในไฟล์แบตช์หรือไม่?
DMA57361

อืมมันช่างแปลกจริงๆ อาจเป็นไปได้ว่า Win7 ของคุณกำลังทำสิ่งที่แตกต่างกับชุดเปรียบเทียบกับ WinXP ของฉันในตอนนั้น ฉันจะสามารถตรวจสอบ Win7 ที่บ้านเย็นนี้มิฉะนั้นฉันกลัวฉันติดอยู่ในขณะนี้ ...
DMA57361

ที่จริงแล้วลองนำหน้าชุดคำสั่งด้วยstartและดูว่าเกิดอะไรขึ้น ไม่เหมาะ แต่ฉันสงสัยว่าอาจช่วยได้
DMA57361

คำตอบ:


42

ก่อนหน้านี้เคยมีคำตอบให้กับเรื่อง Stack Overflow ซึ่งเป็นจุดที่ฉันได้นำแรงผลักดันหลักของคำตอบนี้มาจาก

ลองคำสั่งต่อไปนี้คุณสามารถเรียกใช้จากภายในcmd:

for /d /r . %d in (bin,obj) do @if exist "%d" rd /s/q "%d"

หากคุณต้องการเปลี่ยนโฟลเดอร์อื่นให้เพิ่มรายการใหม่เข้าไปใน(bin,obj)ชุดที่อยู่ตรงกลางคำสั่ง

การดำเนินการนี้จะลบทุกอย่างที่จับคู่โดยไม่มีการเตือนและไม่ต้องใช้ถังรีไซเคิลดังนั้นถ้าคุณต้องการความปลอดภัยเพิ่มเติมให้วางสาย/qจากการโทรไปrdยังจุดสิ้นสุดและระบบควรถามคุณก่อนการลบแต่ละครั้ง

for /d /r . %d in (bin,obj) do @if exist "%d" rd /s "%d"

หากคุณต้องการรันคำสั่งจากภายในแบตช์ไฟล์คุณจะต้องแทนที่ทุกอินสแตนซ์ของตัวแปร%dด้วย%%dดังนี้

for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s/q "%%d"
OR
for /d /r . %%d in (bin,obj) do @if exist "%%d" rd /s "%%d"

ตามการแปลงมีความคิดเห็นในคำถาม

ถ้าคำสั่งปฏิเสธที่จะทำงานในไฟล์ชุด (ไม่สามารถที่จะทำซ้ำที่นี่) ลอง prefixing startคำสั่งด้วย แม้ว่าสิ่งนี้จะเริ่มต้นกระบวนการเพื่อให้ทำงานพร้อมกันกับไฟล์แบตช์ซึ่งอาจทำให้เกิดปัญหาอื่น ๆ แต่ดูเหมือนว่ามีแนวโน้มที่จะทำงานได้อย่างถูกต้อง

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


1
คุณอาจทราบหรือไม่ว่าฉันสามารถเพิกเฉยหนึ่งโฟลเดอร์ในโฟลเดอร์รากนี้ที่ฉันใช้คำสั่งนี้ได้หรือไม่
Goran Obradovic

ทำงานอย่างสมบูรณ์แบบ! ขอบคุณ! +1
khr055


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