วิธีแก้ข้อผิดพลาด“ The directory is not empty” เมื่อรันคำสั่ง rmdir ใน batch script?


92

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

rmdir /S /Q "C:\<dir>\"

ฉันขอข้อมูลเกี่ยวกับประเภทไฟล์ที่ windows แจ้งเตือนคุณได้ไหม สำหรับฉันสิ่งนี้เกิดขึ้นเฉพาะกับไฟล์ PDF ไม่นานหลังจากที่ฉันย้าย / คัดลอก
Jake Stevens-Haas

คำตอบ:


88

ฉันประสบปัญหาเดียวกันกับที่ Harry Johnston ได้กล่าวไว้ rmdir /s /qจะบ่นว่าไดเร็กทอรีไม่ว่างแม้ว่าจะ/sมีไว้เพื่อล้างข้อมูลให้คุณก็ตาม! ฉันคิดว่ามันเป็นบั๊กใน Windows โดยส่วนตัว

วิธีแก้ปัญหาของฉันคือdelทุกอย่างในไดเร็กทอรีก่อนที่จะลบไดเร็กทอรีเอง:

del /f /s /q mydir 1>nul
rmdir /s /q mydir

( 1>nulซ่อนเอาต์พุตมาตรฐานdelเนื่องจากมิฉะนั้นจะแสดงรายการไฟล์ทุกไฟล์ที่ลบ)


ฉันพบสถานการณ์ที่ไดเรกทอรีย่อยบางรายการภายในmydirเกิดข้อผิดพลาด "not empty" เดียวกัน ดังนั้นฉันจึงต้องcdเข้าไปmydirและดำเนินการdelกับไฟล์ในแต่ละไดเร็กทอรีเหล่านั้นด้วย ในที่สุดมันก็ได้ผล แต่ถ้าฉันต้องทำซ้ำเป็นครั้งที่สามในระดับย่อยอื่นฉันคงรู้สึกพ่ายแพ้ไปแล้ว
gfullam

@gfullam เท่าที่ฉันจำได้วิธีของฉันควรใช้กับไดเร็กทอรีย่อยแบบเรียกซ้ำเช่นกันสำหรับความลึกใด ๆ นั่นคือสิ่งที่del /sทำ
BoffinBrain

การใช้ explorer (อาจรวมถึง mkdir => NO!) การเพิ่มโฟลเดอร์ (และการเปลี่ยนชื่อ) จะทำให้งานลบโดยใช้rd /s /q mydirคำสั่งเท่านั้น
Master DJon

1
โอเคฉันคิดว่าการลบหน้าต่างและย้ายไปที่ Linux นั้นง่ายกว่าความเจ็บปวดนี้มาก :)
RajnishCoder

1
@RajnishCoder การใช้ชีวิตกับ Windows โดยพื้นฐานแล้วเป็นโลกแห่งการแก้ปัญหา ปัญหาเฉพาะนี้ไม่มีอะไรเทียบกับปัญหาอื่น ๆ ใน Windows 10!
BoffinBrain

47

ฉันคุ้นเคยกับปัญหานี้ วิธีแก้ปัญหาที่ง่ายที่สุดคือการดำเนินการซ้ำตามเงื่อนไข ฉันไม่เคยเห็นมันล้มเหลวสองครั้งติดต่อกัน - เว้นแต่จะมีไฟล์ที่เปิดอยู่หรือปัญหาการอนุญาตอย่างเห็นได้ชัด!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme

11
มอลลี่ศักดิ์สิทธิ์สิ่งนี้ไม่มีเหตุผล แต่มันก็ใช้งานได้ อะไร #!% # @! microsoft
Sam B

IF EXISTซ่อนAccess is deniedและสถานการณ์อื่น ๆ ฉันได้เพิ่มสิ่งที่ชอบDIR c:\deletemeและการตรวจสอบก่อนทุกอย่าง
it3xl

การเปิด windows explorer ในไดเร็กทอรีย่อยหรือการเรียกดูจะทำให้การดำเนินการนี้ล้มเหลวสองครั้งติดต่อกัน อย่าลืมถามเป็นครั้งที่สาม (ซึ่งใช้งานได้จริง)
Jake Stevens-Haas

จริงๆแล้วมันได้เกิดขึ้นเป็นครั้งที่สองในแถวสำหรับฉันโดยไม่ต้องเปิดอะไรหรือปัญหาสิทธิ์ บันทึกของฉันคือเจ็ดครั้ง แนะนำแนวทางของ @ BoffinbraiN
Jake Stevens-Haas

ฉันวิ่งเพียงคำสั่งแรก จากนั้นคลิกขวาที่โฟลเดอร์> คุณสมบัติ> ยกเลิกการเลือกแอตทริบิวต์ "อ่านอย่างเดียว"> นำไปใช้ ในที่สุด Viola! โฟลเดอร์ก็หายไป
steven7mwesigwa

21

ฉันเพิ่งพบปัญหาเดียวกันและเกี่ยวข้องกับบางไฟล์ที่สูญหายหรือเสียหาย ในการแก้ไขปัญหาเพียงเรียกใช้ check disk:

chkdsk /F e:

สามารถเรียกใช้จากกล่องค้นหาหน้าต่างหรือจากพรอมต์ cmd /Fแก้ไขปัญหาใด ๆ ที่พบเช่นการกู้คืนไฟล์ เมื่อเสร็จสิ้นคุณสามารถลบไฟล์และโฟลเดอร์ได้ตามปกติ


สมบูรณ์แบบฉันพยายามมาตั้งแต่ครึ่งชั่วโมง
trex

สิ่งนี้พบไฟล์ที่ซ่อนอยู่ในโฟลเดอร์ของฉันซึ่งฉันก็สามารถลบได้ น่ารังเกียจจริงๆ😑
ตี

21

เข้าสู่ Command Prompt ในฐานะผู้ดูแลระบบและเรียกใช้

rmdir /s <FOLDER>

2
นี่ไม่ต่างกับสิ่งที่ OP กำลังทำอยู่
Harry Johnston

7

ฉันมีปัญหาคล้ายกันพยายามลบโฟลเดอร์ว่างผ่าน windows explorer แสดงให้ฉันเห็นข้อผิดพลาด not empty ดังนั้นฉันคิดว่าฉันลองผ่าน admin cmd แต่ไม่มีคำตอบใดที่ช่วยได้

หลังจากที่ฉันย้ายไฟล์ไปไว้ในโฟลเดอร์ว่าง ฉันสามารถลบโฟลเดอร์ที่ไม่ว่างเปล่า


1
กรุณาเขียนไว้ในความคิดเห็น
Virb

น่าสนใจ. อาจไม่เกี่ยวข้องกับสถานการณ์ OPs แม้ว่า
Harry Johnston

Holy moly นี่เป็นเพียงความคิดเดียวที่ใช้ได้ผลกับโซลูชันอื่น ๆ ทั้งหมดนี้!
Seega

3

ดังที่ @gfullam ระบุไว้ในความคิดเห็นถึงคำตอบของ @ BoffinbraiN การที่<dir>คุณลบตัวเองอาจไม่ใช่ไฟล์ที่มีไฟล์: อาจมีไดเร็กทอรีย่อย<dir>ที่ได้รับข้อความ "The directory is not empty" และทางออกเดียวคือ วนซ้ำในไดเรกทอรีโดยลบไฟล์ที่มีทั้งหมดด้วยตนเอง ... ฉันตัดสินใจใช้พอร์ตrmจาก UNIX rm.exeมาพร้อมกับ Git Bash, MinGW, Cygwin, GnuWin32 และอื่น ๆ คุณเพียงแค่ต้องมีไดเร็กทอรีหลักใน PATH ของคุณจากนั้นดำเนินการตามที่คุณต้องการในระบบ UNIX

ตัวอย่างสคริปต์แบทช์:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"

2

สิ่งที่เหมาะกับฉันมีดังต่อไปนี้ ฉันดูเหมือนว่าคำสั่ง RMDir จะออก "ไดเร็กทอรีไม่ว่าง" เกือบตลอดเวลา ...

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders

2

ฉันมี "C: \ Users \ User Name \ OneDrive \ Fonts" ซึ่งถูก mklink'ed (/ D) เป็น "C: \ Windows \ Fonts" และฉันก็พบปัญหาเดียวกัน ในกรณีของฉัน

cd "C: \ Users \ ชื่อผู้ใช้ \ OneDrive"

rd / s แบบอักษร

Y (เพื่อยืนยันการกระทำ)

ช่วยฉันด้วย ฉันหวังว่ามันจะช่วยคุณเช่นกัน; D


2
เพิ่ม / q เพื่อหลีกเลี่ยงความจำเป็นในการยืนยันเมื่อเรียกใช้ชุดงาน
Jonathan Rosenne

1

ในกรณีของฉันฉันเพิ่งย้ายโฟลเดอร์ไปยังไดเรกทอรีรากเช่นนั้น

move <source directory> c:\

จากนั้นรันคำสั่งเพื่อลบไดเร็กทอรี

rmdir c:\<moved directory> /s /q

2
rmdir c:\<moved directory> /s /qคือคำตอบที่ถูกต้อง
lalengua

1
ไม่ใช่คำตอบที่ถูกต้อง การลบโฟลเดอร์ในรูทอาจทำให้เกิดข้อความเดียวกัน: โฟลเดอร์ไม่ว่างเปล่า
Gangnus

ฉันรู้ว่านี่เป็นกระทู้เก่า แค่อยากจะบอกว่าสิ่งนี้ได้ผลสำหรับฉัน ...
Manuel Rivera

1

สาเหตุที่rd /sปฏิเสธที่จะลบไฟล์บางไฟล์น่าจะเกิดจากแอตทริบิวต์ของไฟล์ READONLY ในไฟล์ในไดเร็กทอรี

วิธีที่เหมาะสมในการแก้ไขปัญหานี้คือตรวจสอบให้แน่ใจว่าคุณได้รีเซ็ตแอตทริบิวต์ในไฟล์ทั้งหมดก่อน:

attrib -r %directory% /s /d
rd /s %directory%

อาจมีไฟล์อื่น ๆ เช่นไฟล์ที่ซ่อนอยู่หรือไฟล์ระบบดังนั้นหากคุณต้องการเล่นอย่างปลอดภัย:

attrib -h -r -s %directory% /s /d
rd /s %directory%

0

คล้ายกับคำตอบของ Harry Johnston ฉันวนซ้ำจนกว่าจะได้ผล

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)

0

บางครั้ง Windows "เสียจากการออกแบบ" ดังนั้นคุณต้องสร้างโฟลเดอร์ว่างจากนั้นสะท้อน "โฟลเดอร์ที่เสียหาย" ด้วย "โฟลเดอร์ว่าง" ด้วยโหมดสำรองข้อมูล

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

สร้าง dir ว่างเปล่าเช่นนี้:

mkdir empty

เขียนทับโฟลเดอร์ที่เสียด้วยช่องว่างเช่นนี้:

robocopy /copyall /mir /b empty broken

แล้วลบโฟลเดอร์นั้น

rd broken /s
rd empty /s

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


ใช่ฉันคิดว่า Robocopy จะทำงานในสถานการณ์ OPs ได้เนื่องจากจะพยายามดำเนินการที่ล้มเหลวโดยอัตโนมัติ คุณอาจต้องการระบุ/W:0เพื่อหลีกเลี่ยงความล่าช้าโดยไม่จำเป็น คุณอาจไม่ต้องการ/bเนื่องจากต้องใช้สิทธิ์ระดับผู้ดูแลระบบ โหมดการกู้คืนไม่เกี่ยวข้องกับคำถามนี้เนื่องจากเรากำลังพูดถึงชุดสคริปต์ไม่ใช่คนที่พยายามลบไดเรกทอรีด้วยตนเอง
Harry Johnston

-1

ฉันสามารถนึกถึงสาเหตุที่เป็นไปได้ดังต่อไปนี้:

  1. มีไฟล์หรือไดเรกทอรีย่อยที่ต้องการการอนุญาตที่สูงขึ้น
  2. มีไฟล์ที่ใช้งานไม่เพียง แต่โดย WSearch เท่านั้น แต่อาจเกิดจากโปรแกรมสแกนไวรัสหรือสิ่งอื่นใด

สำหรับ 1. ) คุณสามารถลองrunas /user:Administratorเพื่อรับสิทธิ์ที่สูงขึ้นหรือเริ่มไฟล์แบตช์ในฐานะผู้ดูแลระบบผ่านเมนูบริบท หากไม่ได้ผลบางทีแม้แต่ผู้ดูแลระบบก็ไม่มีสิทธิ์ จากนั้นคุณจะต้องรับช่วงการเป็นเจ้าของไดเรกทอรี

สำหรับ 2. ) ดาวน์โหลดProcess ExplorerคลิกFind/Find handle or DLL...หรือกดCtrl+Fพิมพ์ชื่อไดเร็กทอรีและค้นหาว่าใครเป็นผู้ใช้ ปิดแอปพลิเคชันที่ใช้ไดเร็กทอรีถ้าเป็นไปได้


เครื่องปิดใช้งานบัญชีผู้ดูแลระบบ ฉันอยู่ในกลุ่มผู้ดูแลระบบ แต่ฉันไม่ทราบรหัสผ่านของผู้ดูแลระบบ ข้อเสนอแนะอื่น ๆ เพื่อหลีกเลี่ยงปัญหาการอนุญาตหรือไม่? มีคนพูดถึงการเรียกโปรแกรมอื่นจากแบทช์ (เช่น vba)
Mayhem

@ Mayhem: การเข้าถึงสิทธิ์ค่อนข้างยาก ... เราอาจต้องใช้ประโยชน์จากจุดบกพร่องใน Windows เพื่อทำสิ่งนั้นโดยไม่ต้องใช้รหัสผ่าน
Thomas Weller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.