วิธีการลบไฟล์ / โฟลเดอร์ย่อยในไดเรกทอรีเฉพาะที่พรอมต์คำสั่งใน Windows


308

บอกเด็ก ๆ ว่ามีตัวแปรที่เรียกว่า%pathtofolder%เนื่องจากทำให้ชัดเจนว่าเป็นเส้นทางแบบเต็มของโฟลเดอร์

ฉันต้องการที่จะลบทุกไฟล์และโฟลเดอร์ย่อยในไดเรกทอรีนี้ แต่ไม่ใช่ไดเรกทอรีเอง

แต่อาจมีข้อผิดพลาดเช่น 'ไฟล์ / โฟลเดอร์นี้ถูกใช้งานแล้ว' ... เมื่อเกิดเหตุการณ์ดังกล่าวขึ้นมาก็ควรดำเนินการต่อและข้ามไฟล์ / โฟลเดอร์นั้น

มีคำสั่งบางอย่างสำหรับเรื่องนี้?



มันเป็นเรื่องยากที่ Windows จะทำการลบโฟลเดอร์ ... หรือสร้างโฟลเดอร์ที่ขึ้นต้นด้วยจุด ... ขอบคุณพระเจ้าสำหรับการรวมระบบกับ Bash ใน Windows! rm -rf path\to\folderใช้งานได้ใน Windows 10 (หรืออาจมาจาก Git Bash ... ไม่ว่าจะด้วยวิธีใดถ้าคุณลองใช้มัน!)
Stijn de Witt

คำตอบ:


256

คุณสามารถใช้เชลล์สคริปต์นี้เพื่อล้างโฟลเดอร์และไฟล์ภายในC:\Temp ซอร์ส :

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

สร้างไฟล์แบตช์ (พูด, delete.bat) ที่มีคำสั่งดังกล่าว ไปที่ตำแหน่งที่มีไฟล์ delete.bat อยู่จากนั้นเรียกใช้คำสั่ง: delete.bat


20
ฉันลองแล้ว แต่น่าเสียดายที่ไฟล์ที่ไม่ถูกลบเฉพาะโฟลเดอร์ย่อยเท่านั้นที่จะถูกลบ ตัวอย่างเช่นฉันมีโฟลเดอร์ชื่อการทดสอบ มันมี 2 โฟลเดอร์ชื่อเป็น "Ripon" และ "Wasim" และมันมีไฟล์ชื่อ "riponalwasim.txt" โฟลเดอร์ย่อย Ripon และ Wasim ถูกลบ แต่ riponalwasim.txt ไม่ถูกลบ
Ripon Al Wasim

16
ใช้เครื่องหมายเปอร์เซ็นต์เดียวหากคุณต้องการเรียกใช้โดยตรงจากบรรทัดคำสั่งเช่น%p
Alex

2
น่าเศร้าที่ใช้ 2 บรรทัด แต่อย่างน้อยก็ใช้งานได้! ฉันเบื่อที่จะค้นหา "สายการบินเดียว" ที่ทำงานและจะไปกับคนนี้ขอบคุณ!
nightcoder

2
คุณสามารถใช้โอเปอเรเตอร์ '&&' เพื่อดำเนินการคำสั่งสองคำสั่งในหนึ่งบรรทัดโดยไม่มีไฟล์ bat (สังเกตเห็น '%' เดี่ยวแทน '%%') del / s / q "myfolder *" & & สำหรับ / D% p IN ("myfolder *") DO rmdir "% p" / s / q
ravinsp

<for / F "delims =" %% i ใน ('dir / b / a-d') ทำ (echo del "%% i" / q)> สามารถช่วยไฟล์ได้ (แค่ลบเสียงสะท้อนนั้น)
grenix

340

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

RMDIR "FOLDERNAME" /S /Q

วิธีนี้จะเป็นการลบโฟลเดอร์และไฟล์และโฟลเดอร์ย่อยทั้งหมด


65
ดูเหมือนว่าจะลบเส้นทางไปยัง OP ที่ต้องการเก็บไว้
Fuzz Evans

4
นี่จะเป็นการลบโฟลเดอร์ออกดังนั้นคุณจะต้องเพิ่มคำสั่งอื่น: md FOLDERNAME(ดูคำตอบจาก @rakoczyn ด้านล่าง)
thdoan

4
คุณสร้าง "backup backup" ที่นี่หมายความว่าอย่างไร ฉันไม่สามารถมองเห็นอะไรที่จะสร้างชนิดของการสำรองข้อมูลใด ๆ ...
พอล Groke

1
สารบบไม่ว่างเปล่าข้อความมาเป็นคำตอบ!
Jamshaid Kamran

10
เพื่อไม่ให้ลบโฟลเดอร์ออกให้เป็นไดเรกทอรีปัจจุบันก่อนจากนั้นใช้ "." ในฐานะ FOLDERNAME การสร้างขึ้นใหม่หลังจากนั้นไม่จำเป็นเหมือนกันเพราะ ACLs อาจสูญหายได้ cd "FOLDERNAME" RD . /S /Q
Moritz ทั้ง

85

ทางออกที่ง่ายที่สุดที่ฉันคิดได้คือการลบไดเรกทอรีทั้งหมดด้วย

RD /S /Q folderPath

จากนั้นสร้างไดเรกทอรีนี้อีกครั้ง:

MD folderPath

5
จะทำอย่างไรถ้าคุณได้รับอนุญาตให้ลบ แต่ไม่สร้างโฟลเดอร์ใหม่? ฉันหวังว่ามันจะเป็นไปได้ :)
Sandy

13
นี่เป็นวิธีการแก้ปัญหาที่ไม่ดีเนื่องจากจะแนะนำการแข่งขันบนระบบไฟล์สำหรับโหนดไดเรกทอรีนั่นคือคำสั่งที่สองสามารถล้มเหลวหากดำเนินการทันทีหลังจาก
Rok Strniša

22
นอกจากนี้วิธีแก้ไขที่ไม่ถูกต้องหากไดเรกทอรีมีสิทธิ์พิเศษที่คุณเพิ่งได้รับahem (ขออภัย)
Immortal Blue

อย่าถูกเลื่อนออกไปพร้อมกับการตอบสนอง: 'ไดเรกทอรีไม่ว่างเปล่า' เพียงแค่ออกคำสั่งสองครั้ง :-)
Kieran Ryan

1
RD และ RMDIR เป็นคำสั่งเดียวกันและเมื่อคุณโพสต์คำตอบนี้ 9 เดือนหลังจากที่มีคนตอบคำถามเดียวกันทำไมผู้คนถึงให้คะแนนคุณ?
สลับ

51

นี่จะเป็นการลบโฟลเดอร์และไฟล์และทิ้งโฟลเดอร์ไว้

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)

4
สำหรับทุกคนที่ไม่แน่ใจเกี่ยวกับวิธีการนี้: แน่นอนไม่สร้างไดเรกทอรีใหม่ หากไม่มี2>nulมันจะแสดงผล "กระบวนการไม่สามารถเข้าถึงไฟล์ได้เนื่องจากกำลังถูกใช้โดยกระบวนการอื่น"
Rok Strniša

6
ฉันเกลียดที่ Windows ไม่สามารถลบไฟล์และโฟลเดอร์ที่โปรแกรมบางโปรแกรมใช้ และฉันรักที่คุณใช้สิ่งที่คุณโปรดปรานในสายการบินเดียว
andref

ดังนั้น uber-magic นี้เป็นวิธีที่เราลบโฟลเดอร์ใน Windows หรือไม่? ประทับใจ :)
mlvljr

3
@mlvljr เฉพาะในกรณีที่คุณต้องการเก็บโฟลเดอร์พาเรนต์ด้วย RD /?จะแสดงวิธีที่ง่ายในการล้างโฟลเดอร์
foxidrive

1
นี่เป็นสิ่งที่ดีถ้าคุณต้องการกลับมาที่ตำแหน่งเริ่มต้นของคุณมิฉะนั้นก็CD mypath && RD /S .เพียงพอแล้ว ฉันไม่ชอบที่คุณต้องทำซ้ำเส้นทางของคุณสองครั้ง แต่สำหรับเส้นทางยาวมันยากที่จะอ่าน ดังนั้นฉันจะเพิ่มset p="mypath"ที่จุดเริ่มต้น
Amit Naidu

39
@ECHO OFF

SET THEDIR=path-to-folder

Echo Deleting all files from %THEDIR%
DEL "%THEDIR%\*" /F /Q /A

Echo Deleting all folders from %THEDIR%
FOR /F "eol=| delims=" %%I in ('dir "%THEDIR%\*" /AD /B 2^>nul') do rd /Q /S "%THEDIR%\%%I"
@ECHO Folder deleted.

EXIT

... ลบไฟล์และโฟลเดอร์ทั้งหมดภายใต้ไดเรกทอรีที่กำหนด แต่ไม่ใช่ไดเรกทอรี


4
นี่ควรเป็นคำตอบที่ถูกต้อง .. เพียงแค่สร้าง .. ไฟล์. deletemyfoldercontents.bat .. ให้ปรากฏขึ้นในพา ธ ของคุณและมันก็ใช้งานได้อย่างมีเสน่ห์ ..
timbrown

3
DELตัวเลือกพลาดท่าบรรทัดคำสั่ง/Aลบยังไฟล์ที่มีการตั้งค่าแอตทริบิวต์ที่ซ่อนอยู่และ%dir%\*ควรจะอัญประกาศเช่นการทำงานยังไดเรกทอรีที่มีช่องว่างหรือหนึ่งในตัวละครเหล่านี้"%dir%\*" &()[]{}^=;!'+,`~และสำหรับบรรทัดคำสั่งควรได้รับการปรับเปลี่ยนให้for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I"เพราะสำหรับไดเรกทอรีละเว้นกับชุดแอตทริบิวต์ซ่อน DIRพร้อมตัวเลือกจะ/AD /Bแสดงไดเรกทอรีทั้งหมดที่มีเพียงชื่อ BTW: dirไม่ใช่ชื่อที่ดีสำหรับตัวแปรสภาพแวดล้อม
Mofi

1
ไม่ลบโฟลเดอร์ย่อย
RMiranda

1
@Miranda ในการทดสอบของฉันมันทำตรงตามที่ OP ถาม คุณมีกรณีที่จะไม่ลบโฟลเดอร์ย่อยหรือไม่?
thepip3r

คำตอบนี้ตรงกับความต้องการหรือไม่"อาจมีข้อผิดพลาดเช่น 'ไฟล์ / โฟลเดอร์นี้ถูกใช้งานอยู่' ... เมื่อเกิดเหตุการณ์นี้ขึ้นควรจะดำเนินการต่อและข้ามไฟล์ / โฟลเดอร์นั้น" ?
ปีเตอร์มอร์เทนเซ่น

30
CD [Your_Folder]
RMDIR /S /Q .

คุณจะได้รับข้อความแสดงข้อผิดพลาดบอกคุณว่าคำสั่ง RMDIR ไม่สามารถเข้าถึงโฟลเดอร์ปัจจุบันได้ดังนั้นจึงไม่สามารถลบได้

ปรับปรุง :

จากความคิดเห็นที่มีประโยชน์นี้ (ขอบคุณMoritz ทั้งคู่ ) คุณสามารถเพิ่มได้&&ดังนั้นRMDIRจะไม่ทำงานหากCDคำสั่งล้มเหลว (เช่นชื่อไดเรกทอรีที่พิมพ์ผิด):

CD [Your_Folder] && RMDIR /S /Q .

จากการอ้างอิงบรรทัดคำสั่งของ Windows :

/ S:ลบแผนผังไดเรกทอรี (ไดเรกทอรีที่ระบุและไดเรกทอรีย่อยทั้งหมดรวมถึงไฟล์ทั้งหมด)

/ Q:ระบุโหมดเงียบ ไม่พร้อมต์ให้ยืนยันเมื่อลบแผนผังไดเร็กทอรี (โปรดทราบว่า / q ทำงานได้เฉพาะเมื่อมีการระบุ / s เท่านั้น)


1
นี้เหมาะสำหรับล้างชั่วคราว แต่ที่cd [Your_Folder]เป็นสิ่งสำคัญสุด - ฉันจะต้องจำไว้ว่าดังนั้นผมจึงไม่ลบไดเรกทอรีของตัวเอง ...
ปัญญาชน

5
นี่คือทางออกที่ถูกต้อง เพิ่ม&&ระหว่างคำสั่งแทนการขึ้นบรรทัดใหม่และคุณจะปลอดภัยจากซีดีที่ล้มเหลว
Moritz ทั้ง

นี่เป็นทางออกที่ง่ายและถูกต้อง ใช้งานได้กับเชลล์คำสั่ง Azure!
ฟิลิปป์

ทางออกที่ไม่ดีพอสมควร ... ฉันต้องการตัวอย่างการลบบรรทัดคำสั่งนี้สำหรับการอัปเดต svn - ฉันต้องการลบไฟล์และโฟลเดอร์ทั้งหมดก่อนที่ฉันจะทำการอัปเดต svn เพราะอาจมีการเปลี่ยนแปลงบางอย่างบนเครื่องที่ฉันใช้สิ่งนี้ เป็นรายการเช็คอินเท่านั้น ทำ RMDIR / S / Q ยังเอาการเชื่อมโยง SVN และดังนั้นจึงทำให้โฟลเดอร์โฟลเดอร์ SVN ไม่มีอีกต่อไป
โดมินิก Lemberger

สิ่งนี้แตกต่างจากคำตอบสี่ข้อก่อนหน้านี้อย่างไร
ปีเตอร์มอร์เทนเซ่น

9

RD ย่อมาจากไดเรกทอรี REMOVE

/ S: ลบไฟล์และโฟลเดอร์ย่อยทั้งหมดยกเว้นตัวโฟลเดอร์เอง ใช้สิ่งนี้เพื่อลบแผนผังโฟลเดอร์ทั้งหมด

/ Q: เงียบ - ไม่แสดงการยืนยัน YN

ตัวอย่าง:

RD /S /Q C:/folder_path/here

1
upvoted ที่เป็นคนเดียวที่จะอธิบายสิ่งที่/Sและ/Qหมายถึง
SourceVisor

2
ไม่rdเท่ากับrmdirและจะลบไดเรกทอรีเองและไม่ใช่สิ่งที่ OP ต้องการ
WesternGun

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

8

ฉันใช้ Powershell

Remove-Item c:\scripts\* -recurse

มันจะลบเนื้อหาของโฟลเดอร์ไม่ใช่ตัวโฟลเดอร์เอง


คำตอบของ rhellem เป็นคำตอบล่าสุด แต่เป็นคำตอบเดียวที่จะทำให้ฉันได้ (ชนะ 8.1 ไม่ใช่ตัวเลือก)
philologon

2
จากบรรทัดคำสั่งแบทช์:powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Rosberg Linhares

โปรดทราบว่าจำเป็นต้องใช้ "*" ไม่เช่นนั้นจะเป็นการลบโฟลเดอร์
mhenry1384

7

ไม่มีคำตอบที่โพสต์เมื่อวันที่ 2018-06-01 ยกเว้นบรรทัดคำสั่งเดียวที่โพสต์โดยfoxidriveลบไฟล์ทั้งหมดและโฟลเดอร์ / ไดเรกทอรีทั้งหมดใน%PathToFolder%จริงๆ นั่นเป็นเหตุผลสำหรับการโพสต์คำตอบมากขึ้นด้วยบรรทัดคำสั่งเดียวง่ายมากที่จะลบไฟล์และโฟลเดอร์ย่อยทั้งหมดของโฟลเดอร์เช่นเดียวกับไฟล์ชุดที่มีวิธีการแก้ปัญหาที่ซับซ้อนมากขึ้นอธิบายว่าทำไมคำตอบอื่น ๆ ทั้งหมดเป็นโพสต์บน 2018/06/01 โดยใช้DELและFORกับRDล้มเหลวในการล้างโฟลเดอร์อย่างสมบูรณ์


โซลูชันบรรทัดคำสั่งเดี่ยวแบบง่ายซึ่งแน่นอนว่าสามารถใช้ในไฟล์แบตช์ได้:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

บรรทัดคำสั่งนี้มีสามคำสั่งดำเนินการหนึ่งหลังจากที่อื่น

คำสั่งแรกPUSHDผลักเส้นทางไดเรกทอรีปัจจุบันบนกองและทำให้ต่อไป%PathToFolder%ไดเรกทอรีปัจจุบันสำหรับการเรียกใช้กระบวนการคำสั่ง

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

PUSHDเอาต์พุตข้อความแสดงข้อผิดพลาดต่อไปนี้เพื่อจัดการSTDERRหากไดเร็กทอรีที่ระบุไม่มีอยู่เลย:

ระบบไม่สามารถหาเส้นทางที่ระบุ.

ข้อความแสดงข้อผิดพลาดนี้ถูกระงับโดยการเปลี่ยนเส้นทาง2>nulไปยังอุปกรณ์NUL NUL

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

คำสั่งRDพร้อมตัวเลือก/Qและ/Sลบไดเรกทอรีอย่างเงียบ ๆพร้อมกับไดเรกทอรีย่อยทั้งหมดแม้ว่าไดเรกทอรีที่ระบุจะมีไฟล์หรือโฟลเดอร์ที่มีแอตทริบิวต์ที่ซ่อนอยู่หรือมีชุดแอตทริบิวต์อ่านอย่างเดียว คุณลักษณะของระบบไม่เคยป้องกันการลบไฟล์หรือโฟลเดอร์

ไม่ถูกลบคือ:

  1. โฟลเดอร์ที่ใช้เป็นไดเรกทอรีปัจจุบันสำหรับกระบวนการทำงานใด ๆ แผนผังโฟลเดอร์ทั้งหมดไปยังโฟลเดอร์ดังกล่าวไม่สามารถลบได้หากใช้โฟลเดอร์เป็นไดเรกทอรีปัจจุบันสำหรับกระบวนการทำงานใด ๆ

  2. ไฟล์ที่เปิดอยู่ในปัจจุบันโดยกระบวนการทำงานใด ๆ ที่มีสิทธิ์การเข้าถึงไฟล์ที่กำหนดไว้ในไฟล์ที่เปิดอยู่เพื่อป้องกันการลบไฟล์ในขณะที่เปิดโดยแอปพลิเคชัน / กระบวนการที่กำลังทำงานอยู่ ไฟล์ที่เปิดดังกล่าวจะป้องกันการลบทรีโฟลเดอร์ทั้งหมดไปยังไฟล์ที่เปิดอยู่

  3. ไฟล์ / โฟลเดอร์ที่ผู้ใช้ปัจจุบันไม่มีสิทธิ์ที่จำเป็น (NTFS) ในการลบไฟล์ / โฟลเดอร์ซึ่งป้องกันการลบทรีของโฟลเดอร์ไปยังไฟล์ / โฟลเดอร์นี้

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

กระบวนการไม่สามารถเข้าถึงไฟล์ได้เนื่องจากกำลังถูกใช้โดยกระบวนการอื่น

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

ข้อความผิดพลาดนี้เช่นข้อความผิดพลาดอื่น ๆ ทั้งหมดซึ่งอาจเกิดขึ้นเนื่องจากเหตุผลสามประการที่เขียนข้างต้นจะถูกระงับโดยการเปลี่ยนเส้นทางด้วย2>nulจากการจับSTDERRไปยังอุปกรณ์NUL

คำสั่งที่สามpopd , จะถูกดำเนินการอย่างเป็นอิสระของมูลค่าทางออกของคำสั่งRD

POPDจะแสดงเส้นทางไดเรกทอรีที่ผลักดันโดยPUSHDจากสแต็กและเปลี่ยนไดเรกทอรีปัจจุบันสำหรับการเรียกใช้กระบวนการคำสั่งไปยังไดเรกทอรีนี้เช่นเรียกคืนไดเรกทอรีปัจจุบันเริ่มต้น POPDลบอักษรระบุไดรฟ์ชั่วคราวที่สร้างโดยPUSHDในกรณีที่เส้นทางโฟลเดอร์ UNC

หมายเหตุ: POPDสามารถล้มเหลวในการกู้คืนไดเร็กทอรีปัจจุบันเริ่มต้นในกรณีที่ไดเรกทอรีปัจจุบันเริ่มต้นเป็นไดเรกทอรีย่อยของไดเรกทอรีเพื่อล้างซึ่งไม่มีอยู่อีกต่อไป ในกรณีพิเศษนี้%PathToFolder%ยังคงไดเรกทอรีปัจจุบัน ดังนั้นจึงแนะนำให้รันบรรทัดคำสั่งด้านบนไม่ใช่จากไดเรกทอรีย่อยของ%PathToFolder%ดังนั้นจึงแนะนำให้เรียกใช้บรรทัดคำสั่งดังกล่าวข้างต้นไม่ได้มาจากไดเรกทอรีย่อยของ

ข้อเท็จจริงที่น่าสนใจอีกข้อหนึ่ง: ฉันลองใช้บรรทัดคำสั่งโดยใช้เส้นทาง UNC ด้วยการแชร์ไดเรกทอรีท้องถิ่นC:\Tempด้วยชื่อที่Tempใช้ร่วมกันและใช้เส้นทาง UNC ที่\\%COMPUTERNAME%\Temp\CleanTestกำหนดให้กับตัวแปรสภาพแวดล้อมPathToFolderใน Windows 7 หากไดเรกทอรีปัจจุบันในการเรียกใช้บรรทัดคำสั่งเป็นไดเรกทอรีย่อยของท้องถิ่นที่ใช้ร่วมกัน การเข้าถึงโฟลเดอร์โดยใช้เส้นทาง UNC เช่นC:\Temp\CleanTest\Subfolder1, Subfolder1จะถูกลบโดยRDและถัดpopdล้มเหลวในการทำเงียบC:\Temp\CleanTest\Subfolder1อีกครั้งไดเรกทอรีปัจจุบันผลในการไปยังไดเรกทอรีที่มีอยู่ในท้องถิ่นจริงๆ น่าเสียดายที่POPDZ:\CleanTestส่วนที่เหลือเป็นไดเรกทอรีปัจจุบันสำหรับกระบวนการทำงานคำสั่ง ดังนั้นในกรณีที่พิเศษมากตัวอักษรไดรฟ์ชั่วคราวจะยังคงอยู่จนกว่าไดเรกทอรีปัจจุบันจะเปลี่ยนไปเช่นcd /D %SystemRoot%ไม่ออกมีมูลค่ามากขึ้น 0 ถ้ามันล้มเหลวในการเรียกคืนไดเรกทอรีปัจจุบันเริ่มต้นที่ทำให้มันเป็นไปไม่ได้ในการตรวจสอบสภาพของข้อผิดพลาดนี้มากเป็นพิเศษโดยใช้เพียงรหัสทางออกของpopd อย่างไรก็ตามมันอาจจะเป็นไปได้ว่าไม่มีใครที่เคยเจอกรณีข้อผิดพลาดพิเศษนี้เนื่องจากเส้นทางของ UNC มักจะไม่ถูกใช้เพื่อเข้าถึงไฟล์และโฟลเดอร์ในเครื่อง

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

  • pushd /?
  • popd /?
  • rd /?

บรรทัดเดียวที่มีหลายคำสั่งโดยใช้ไฟล์ชุด Windowsอธิบายผู้ประกอบการ&&และ&ใช้ที่นี่


ถัดไปให้เรามองในการแก้ปัญหาแฟ้มชุดใช้คำสั่งDELเพื่อลบไฟล์ใน%PathToFolder%และFORและRD%PathToFolder%ลบโฟลเดอร์ย่อยใน

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"

rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"

rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder

rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"

rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder

rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul

rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

:EndCleanFolder
endlocal

ไฟล์แบตช์แรกตรวจสอบให้แน่ใจว่าตัวแปรสภาพแวดล้อมPathToFolderถูกกำหนดด้วยพา ธ โฟลเดอร์จริงๆโดยไม่ต้องใส่เครื่องหมายอัญประกาศคู่และไม่มีแบ็กสแลชที่ท้าย แบ็กสแลชที่ท้ายจะไม่เป็นปัญหา แต่เครื่องหมายคำพูดคู่ในเส้นทางโฟลเดอร์อาจเป็นปัญหาได้เนื่องจากค่าของPathToFolderถูกต่อกับสตริงอื่น ๆ ระหว่างการดำเนินการแบตช์ไฟล์

สิ่งสำคัญคือสองบรรทัด:

del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul

คำสั่งDELใช้เพื่อลบไฟล์ทั้งหมดในไดเรกทอรีที่ระบุ

  • ตัวเลือกที่/Aมีความจำเป็นในการดำเนินการจริงๆไฟล์ทั้งหมดรวมถึงไฟล์ที่มีคุณลักษณะที่ซ่อนอยู่ซึ่งDEL/Aจะไม่สนใจโดยไม่ต้องใช้ตัวเลือก
  • ตัวเลือก/Fมีความจำเป็นในการบังคับลบไฟล์ด้วยชุดคุณสมบัติอ่านอย่างเดียว
  • ตัวเลือก /Qมีความจำเป็นต้องเรียกใช้การลบแบบเงียบ ๆ ของหลาย ๆ ไฟล์โดยไม่แจ้งให้ผู้ใช้ทราบหากควรลบหลาย ๆ ไฟล์
  • >nulจำเป็นต้องเปลี่ยนเส้นทางเอาต์พุตของชื่อไฟล์ที่เขียนเพื่อจัดการSTDOUTไปยังอุปกรณ์NULซึ่งไม่สามารถลบได้เนื่องจากไฟล์เปิดอยู่ในขณะนี้หรือผู้ใช้ไม่ได้รับอนุญาตให้ลบไฟล์
  • 2>nul จำเป็นต้องเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดสำหรับแต่ละไฟล์ที่ไม่สามารถลบออกจากมือจับได้ STDERRไปยังอุปกรณ์NUL

คำสั่งFORและRDใช้เพื่อลบไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่ระบุ แต่for /Dไม่ได้ใช้เนื่องจากFORจะข้ามไปในไดเรกทอรีย่อยกรณีนี้ด้วยชุดแอตทริบิวต์ที่ซ่อนอยู่ ด้วยเหตุผลนั้นfor /Fกล่าวจะใช้เพื่อเรียกใช้บรรทัดคำสั่งต่อไปนี้ในกระบวนการคำสั่งแยกต่างหากที่เริ่มต้นในพื้นหลังด้วย%ComSpec% /c:

dir "%PathToFolder%\*" /AD /B 2>nul

DIRแสดงผลในรูปแบบเปล่าเนื่องจาก/Bรายการไดเรกทอรีที่มีคุณสมบัติDเช่นชื่อของไดเรกทอรีย่อยทั้งหมดในไดเรกทอรีที่ระบุเป็นอิสระในคุณลักษณะอื่น ๆ เช่นคุณลักษณะที่ซ่อนอยู่โดยไม่มีเส้นทาง 2>nulถูกใช้เพื่อเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดโดยDIRบนไม่พบไดเรกทอรีจากหมายเลขอ้างอิง STDERRไปยังอุปกรณ์NUL

ผู้ประกอบการเปลี่ยนเส้นทาง>จะต้องหลบหนีด้วยตัวอักษรเครื่องหมายตก^บนบรรทัดคำสั่งFORที่จะตีความว่าเป็นตัวอักษรเมื่อล่ามคำสั่งของ Windows ประมวลผลบรรทัดคำสั่งนี้ก่อนที่จะดำเนินการคำสั่งสำหรับที่รันฝังdirบรรทัดคำสั่งในขั้นตอนการสั่งแยกต่างหากเริ่มต้น ในพื้นหลัง.

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

FOR ที่มีตัวเลือก/Fจะละเว้นบรรทัดว่างที่ไม่ได้เกิดขึ้นที่นี่เป็น DIRพร้อมตัวเลือก/Bจะไม่ส่งออกบรรทัดว่าง

สำหรับจะละเว้นบรรทัดที่ขึ้นต้นด้วยเครื่องหมายอัฒภาคซึ่งเป็นจุดสิ้นสุดเริ่มต้นของอักขระบรรทัด ชื่อไดเรกทอรีสามารถเริ่มต้นด้วยเครื่องหมายอัฒภาค ด้วยเหตุeol=|นี้จึงใช้เพื่อกำหนดอักขระแถบแนวตั้งเป็นอักขระสิ้นสุดบรรทัดซึ่งไม่มีไดเร็กทอรีหรือไฟล์ในชื่อ

เพื่อจะแยกสายเข้าสตริงโดยใช้พื้นที่และแท็บแนวนอนเป็นตัวคั่นและจะกำหนดเฉพาะพื้นที่แรก / Iแท็บสตริงคั่นตัวแปรห่วงระบุ พฤติกรรมการแยกนี้ไม่ต้องการที่นี่เพราะชื่อไดเรกทอรีสามารถมีช่องว่างอย่างน้อยหนึ่งช่องว่าง ดังนั้นdelims=จะใช้เพื่อกำหนดรายการว่างของตัวคั่นเพื่อปิดใช้งานลักษณะการแบ่งบรรทัดและได้รับมอบหมายให้กับตัวแปรลูปIเสมอชื่อไดเรกทอรีที่สมบูรณ์

คำสั่งสำหรับรันคำสั่งRDสำหรับแต่ละชื่อไดเรกทอรีโดยไม่มีพา ธ ซึ่งเป็นเหตุผลว่าทำไมบนบรรทัดคำสั่งRDต้องระบุพา ธ โฟลเดอร์อีกครั้งซึ่งเชื่อมต่อกับชื่อโฟลเดอร์ย่อย

เพื่อทำความเข้าใจคำสั่งที่ใช้และวิธีการทำงานให้เปิดหน้าต่างพรอมต์คำสั่งดำเนินการคำสั่งต่อไปนี้และอ่านหน้าวิธีใช้ทั้งหมดที่แสดงสำหรับแต่ละคำสั่งอย่างระมัดระวัง

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rd /?
  • rem /?
  • set /?
  • setlocal /?

5

ใช้Notepadเพื่อสร้างเอกสารข้อความและคัดลอก / วาง:

rmdir /s/q "%temp%"
mkdir "%temp%"

เลือกบันทึกเป็นและชื่อไฟล์:

delete_temp.bat

บันทึกเป็นประเภท: ไฟล์ทั้งหมดและคลิกที่ Saveปุ่ม

มันทำงานกับบัญชีประเภทใดก็ได้ (ผู้ดูแลระบบหรือผู้ใช้มาตรฐาน) เพียงแค่เรียกใช้!

ฉันใช้ตัวแปรชั่วคราวในตัวอย่างนี้ แต่คุณสามารถใช้ตัวแปรอื่นได้! PS: สำหรับ Windows OS เท่านั้น!


วิธีแก้ปัญหาที่ค่อนข้างง่ายและสะอาด
Carlos Liu

4

ในการลบไฟล์:

del PATH_TO_FILE

หากต้องการลบโฟลเดอร์ที่มีไฟล์ทั้งหมดอยู่:

rmdir /s /q PATH_TO_FOLDER

ในการลบไฟล์ทั้งหมดจากโฟลเดอร์เฉพาะ (ไม่ลบโฟลเดอร์เอง) ค่อนข้างซับซ้อนเล็กน้อย del /s *.*ไม่สามารถลบโฟลเดอร์ แต่ลบไฟล์จากโฟลเดอร์ย่อยทั้งหมด ดังนั้นจึงจำเป็นต้องใช้สองคำสั่ง:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"

ใช่ถูกต้องแล้ว ต้องเป็นสองขั้นตอน สิ่งนี้สมควรได้รับการโหวตมากขึ้นเพราะมันอธิบายว่าทำไมเมื่อเปรียบเทียบกับคำตอบที่โหวตมากกว่าข้างต้น
WesternGun

DELพลาดท่าบรรทัดคำสั่งตัวเลือก/Aที่จะลบไฟล์ยังมีชุดแอตทริบิวต์ที่ซ่อนอยู่และตัวเลือก/Fที่จะลบไฟล์ยังมีชุดคุณลักษณะอ่านอย่างเดียวและคำพูดสองรอบอาร์กิวเมนต์สุดท้าย ดังนั้นdel /A /F /Q "PATH_TO_FOLDER\*"จะดีกว่า และสำหรับบรรทัดคำสั่งควรได้รับการปรับเปลี่ยนให้for /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I"เพราะสำหรับไดเรกทอรีละเว้นกับชุดแอตทริบิวต์ซ่อน DIRพร้อมตัวเลือกจะ/AD /Bแสดงไดเรกทอรีทั้งหมดPATH_TO_FOLDERด้วยชื่อของมัน
Mofi

สิ่งนี้แตกต่างจากคำตอบก่อนหน้า (บางส่วน) อย่างไร
ปีเตอร์มอร์เทนเซ่น

4

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

RMDIR [/S] [/Q] [drive:]path            

สิ่งนี้แตกต่างจากคำตอบสองข้อก่อนหน้านี้อย่างไร
ปีเตอร์มอร์เทนเซ่น

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

1

ฉันลองวิธีการเหล่านี้หลายวิธี แต่ไม่มีวิธีใดทำงานอย่างถูกต้อง

ฉันพบวิธีสองขั้นตอนนี้ในไซต์Windows Command Line :

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

มันทำงานตรงตามที่ฉันต้องการและเป็นไปตามที่ระบุโดย OP


สองบรรทัดคำสั่งสามารถรวมกันเพื่อบรรทัดคำสั่งอย่างใดอย่างหนึ่ง: forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file" DELตัวเลือก/Aจะถูกเพิ่มไปยังลบไฟล์ที่มีการตั้งค่าแอตทริบิวต์ซ่อนเป็นอย่างอื่นDEL%pathtofolder%หากว่าเอาท์พุทข้อความข้อผิดพลาดไม่พบสำหรับแต่ละไฟล์ที่ซ่อนอยู่ใน ตัวเลือกDEL/Fถูกเพิ่มเพื่อลบไฟล์ที่มีแอ็ตทริบิวต์แบบอ่านอย่างเดียวตั้งค่า%pathtofolder%มิฉะนั้นDELจะส่งออกข้อความแสดงข้อผิดพลาดที่ปฏิเสธการเข้าถึง
Mofi

การแก้ปัญหานี้เป็นที่ช้าที่สุดของการแก้ปัญหาทั้งหมดที่ไม่สมบูรณ์โพสต์ที่นี่เพราะของการเริ่มต้นอินสแตนซ์สำหรับแต่ละไฟล์และไดเรกทอรีในแต่ละcmd.exe %pathtofolder%ข้อดีคือFORFILESไม่ละเว้นไดเรกทอรีที่มีชุดแอตทริบิวต์ที่ซ่อนอยู่เป็นเพื่อไม่
Mofi

เรื่อง"มันทำงานตรงตามที่ฉันต้องการและเป็นไปตามที่ระบุโดย OP" : คุณได้ทดสอบความต้องการ"อาจมีข้อผิดพลาดเช่น 'ไฟล์ / โฟลเดอร์นี้ถูกใช้งานแล้ว' ... เมื่อเกิดเหตุการณ์ขึ้นมันควรจะดำเนินการต่อและข้ามไฟล์ / โฟลเดอร์นั้น" ?
ปีเตอร์มอร์เทนเซ่น

0
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q

บรรทัดที่ 2 จะลบไฟล์ในแต่ละไฟล์ออกจากโฟลเดอร์ทั้งหมดในไดเรกทอรีชั่วคราวของ Windows และบรรทัดที่ 3 จะล้างข้อมูลไดเรกทอรีรวมถึงเนื้อหา
Robie

บรรทัดคำสั่งFORควรได้รับการแก้ไขfor /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"เนื่องจากเป็นFORละเว้นไดเรกทอรีที่มีชุดแอตทริบิวต์ที่ซ่อนอยู่ DIRพร้อมตัวเลือกจะ/AD /Bแสดงไดเรกทอรีทั้งหมด%TEMP%ด้วยชื่อของมัน
Mofi

เอกสารสำหรับ DEL ฉันคิดว่าคุณอยู่ในเส้นทางที่ถูกต้องด้วย / F: "เพิกเฉยการตั้งค่าแบบอ่านอย่างเดียวและลบต่อไป (บังคับ)"
Peter Mortensen

-10

ใช้:

del %pathtofolder%\*.*   /s /f  /q

การทำเช่นนี้จะเป็นการลบไฟล์และโฟลเดอร์ย่อย%pathtofolder%ทั้งหมดรวมถึงไฟล์แบบอ่านอย่างเดียวและไม่พร้อมรับคำยืนยัน


9
ศัตรูนี่ทำให้โฟลเดอร์ย่อยว่างเปล่าใน% pathtofolder%
DH

35
มันไม่ได้ลบโฟลเดอร์ย่อยใน% pathtofolder% แย่มากฉันไม่มีชื่อเสียงที่จะโหวตคำตอบที่เป็นเท็จนี้
Vitalii Korsakov

1
ตามที่ชี้แจงโดย Vitalii Korsakov การลบไฟล์และไฟล์ทั้งหมดจากไดเรกทอรีย่อย แต่ออกจากไดเรกทอรีย่อยในตำแหน่งที่ OP ถามถึงวิธีการลบเช่นกัน
Fuzz Evans

6
แม้ว่าคำสั่งนี้จะทิ้งโฟลเดอร์ว่างไว้ แต่ก็ใกล้กับสิ่งที่ร้องขอมากกว่าคำตอบที่ยอมรับ แน่นอนเรื่องนี้ขึ้นอยู่กับสถานการณ์ ในกรณีของฉันฉันอยากมีโฟลเดอร์เปล่ามากกว่าไฟล์ที่อยู่ในไดเรกทอรีราก
MarcusUA

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