Bir toplu komut dosyasında rmdir komutunu çalıştırırken "dizin boş değil" hatası nasıl çözülür?


92

Bir toplu komut dosyası yapıyorum ve komut dosyasının bir kısmı bir dizini ve tüm alt dizinlerini kaldırmaya çalışıyor. Bir alt dizinin boş olmamasıyla ilgili ara sıra bir hata alıyorum. Suçlu olan indeksleme hakkında bir makale okudum. WSearch'ü devre dışı bıraktım ama sonunda hatayı tekrar aldım. İşte komut:

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

Windows'un sizi uyardığı dosya türleri hakkında biraz bilgi sorabilir miyim? Benim için bu sadece PDF dosyalarında onları taşıdıktan / kopyaladıktan kısa bir süre sonra oluyor.
Jake Stevens-Haas

Yanıtlar:


88

Harry Johnston'un bahsettiği aynı sorunları yaşadım. rmdir /s /qbir dizinin /ssizin için boşaltma yapması gerektiği halde boş olmadığından şikayet eder ! Kişisel olarak Windows'ta bir hata olduğunu düşünüyorum.

Benim çözüm için deldizinin kendisini silmeden önce dizindeki her şey:

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

( Aksi takdirde sildiği her dosyayı listelediği 1>nuliçin standart çıktıyı gizler del.)


İçindeki bazı alt dizinlerin mydiraynı "boş değil" hatasını ürettiği bir senaryoyla karşılaştım . Bu yüzden bu dizinlerdeki dosyalara cdda mydirgirip bunları gerçekleştirmek zorunda kaldım del. Nihayetinde işe yaradı, ancak işlemi başka bir alt seviyede üçüncü kez tekrarlamak zorunda kalsaydım, kendimi oldukça yenilmiş hissederdim.
gfullam

@gfullam Hatırladığım kadarıyla, yöntemim herhangi bir derinlik için özyinelemeli alt dizinler üzerinde de çalışmalı. Bu ne del /syapar.
BoffinBrain

Gezgini kullanarak (muhtemelen mkdir => HAYIR!), Bir klasör eklemek (ve adını değiştirmek), yalnızca rd /s /q mydirkomutu kullanarak kaldırma işini bitirir .
Master DJon

1
Tamam, sanırım pencereleri silip Linux'a geçmek bu acıdan çok daha kolay :)
RajnishCoder

1
@RajnishCoder Windows ile yaşamak, temelde bir geçici çözümler dünyasıdır. Bu özel sorun, Windows 10'daki diğer sorunlara kıyasla hiçbir şey değildir!
BoffinBrain

47

Bu soruna aşinayım. En basit çözüm, işlemi koşullu olarak tekrarlamaktır. Arka arkaya iki kez başarısız olduğunu hiç görmedim - tabii ki açık bir dosya veya izin sorunu olmadıkça!

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

11
kutsal molly, bu henüz bir anlam ifade etmiyor. Ne #!% # @! microsoft
Sam B

IF EXISTgizler Access is deniedve diğer durumlar. Her DIR c:\deletemeşeyden önce kontrol gibi bir şey ve hatalar ekledim .
it3xl

Windows gezgininin bir alt dizinde açık olması veya başka bir şekilde göz atılması bunun arka arkaya iki kez başarısız olmasına neden olur. Bu yüzden üçüncü kez sorduğunuzdan emin olun (gerçekten işe yaradı)
Jake Stevens-Haas

Aslında , açık bir şey veya bir izin sorunu olmadan benim için arka arkaya iki kez meydana geldi. Rekorum yedi kez. @ BoffinbraiN'in yaklaşımını tavsiye edin.
Jake Stevens-Haas

Sadece ilk komutu çalıştırdım. Ardından klasörü sağ tıklayın> Özellikler> 'Salt okunur' özelliğinin işaretini kaldırın> Uygula. Viola !, klasör nihayet kayboldu.
steven7mwesigwa

21

Az önce aynı sorunla karşılaştım ve bazı dosyaların kaybolması veya bozulmasıyla ilgisi vardı. Sorunu düzeltmek için kontrol diskini çalıştırın:

chkdsk /F e:

Bu, arama pencereleri kutusundan veya bir cmd isteminden çalıştırılabilir. /FO dosyaları kurtarmak gibi, bulduğu sorunları giderir. Bu işlem bittiğinde, dosyaları ve klasörleri normal şekilde silebilirsiniz.


Mükemmel, yarım saatten beri deniyorum
trex

Bu, klasörümde bazı gizli dosyalar buldu ve bunları silebildim. Gerçekten kötü 😑
çırpın


7

Benzer bir sorun yaşadım, boş bir klasörü Windows Gezgini aracılığıyla silmeye çalıştım. Bana boş olmayan hatayı gösterdi, bu yüzden yönetici cmd ile denediğimi düşündüm, ancak buradaki cevapların hiçbiri yardımcı olmadı.

Bir dosyayı boş klasöre taşıdıktan sonra. Boş olmayan klasörü silebildim


1
Lütfen yorum olarak yazınız.
virB

İlginç. Yine de muhtemelen OP senaryosuyla ilgili değildir.
Harry Johnston

Kutsal moly, bu diğer çözümlerin hepsinde işe yarayan tam anlamıyla tek düşünceydi!
Seega

3

@Gfullam'ın @ BoffinbraiN'in cevabına yaptığı bir yorumda belirttiği gibi <dir>, sildiğiniz dosya dosyaları içeren dizin olmayabilir: <dir>"Dizin boş değil" mesajını alan alt dizinler olabilir ve bu durumda tek çözüm Dizinler üzerinde yinelemeli olarak yineleyin, içerdikleri tüm dosyaları manuel olarak silin ... Sonunda UNIX'ten bir bağlantı noktası kullanmaya karar verdim rm.rm.exeGit Bash, MinGW, Cygwin, GnuWin32 ve diğerleri ile birlikte gelir. Sadece ana dizininin PATH'inizde olması ve ardından bir UNIX sisteminde yaptığınız gibi çalıştırmanız gerekir.

Toplu komut dosyası örneği:

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

2

Benim için işe yarayan şey şudur. RMDir komutu neredeyse her zaman "Dizin boş değil" yazacak gibi görünüyor ...

: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

Bende "C: \ Users \ User Name \ OneDrive \ Fonts" vardı, bu mklink'lendi (/ D) "C: \ Windows \ Fonts" a ve aynı sorunu yaşadım. Benim durumumda

cd "C: \ Kullanıcılar \ Kullanıcı Adı \ OneDrive"

rd / s Yazı Tipleri

Y (eylemi onaylamak için)

bana yardımcı oldu. Umarım sana da yardımcı olur; D


2
Bir grup çalıştırırken onaylama ihtiyacını ortadan kaldırmak için / q ekleyin.
Jonathan Rosenne

1

Benim durumum, klasörü bu şekilde kök dizine taşıdım.

move <source directory> c:\

Ve sonra dizini kaldırmak için komutu çalıştırın

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

2
rmdir c:\<moved directory> /s /qdoğru cevap
lalengua

1
Doğru cevap DEĞİLDİR. kökteki bir klasörü silmek aynı mesajlara neden olabilir: klasör boş değil.
Gangnus

Bunun eski bir konu olduğunu biliyorum. Bunun benim için işe yaradığını söylemek istedim ...
Manuel Rivera

1

rd /sBelirli dosyaları silmeyi reddetme nedeni , büyük olasılıkla dizindeki dosyalardaki HAZIR dosya özniteliklerinden kaynaklanmaktadır.

Bunu düzeltmenin doğru yolu, önce tüm dosyalardaki öznitelikleri sıfırladığınızdan emin olmaktır:

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

Gizli veya sistem dosyaları gibi başkaları da olabilir, bu yüzden güvenli bir şekilde oynatmak istiyorsanız:

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

0

Harry Johnston'ın cevabına benzer şekilde, işe yarayana kadar döngü yapıyorum.

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

0

Windows bazen "tasarım gereği bozulur", bu nedenle boş bir klasör oluşturmanız ve ardından "bozuk klasörü" yedekleme modunda "boş bir klasör" ile yansıtmanız gerekir.

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

Bunun gibi bir boş dizin oluşturun:

mkdir empty

Bozuk klasörün üzerine şu şekilde boş yazın:

robocopy /copyall /mir /b empty broken

ve sonra bu klasörü silin

rd broken /s
rd empty /s

Bu işe yaramazsa, yeniden başlat düğmesini tıklarken shift tuşunu basılı tutarak ve kurtarma modunda bu komutu yeniden çalıştırmayı deneyerek "komut istemiyle kurtarma modunda" yeniden başlatmayı deneyin.


Evet, Robocopy'nin OP senaryosunda çalışacağını düşünüyorum, çünkü başarısız işlemleri otomatik olarak yeniden deniyor. /W:0Gereksiz gecikmelerden kaçınmak için muhtemelen belirtmek istersiniz . /bYönetici ayrıcalıkları gerektirdiği için istemeyebilirsiniz . Kurtarma modu bu soruyla ilgili değildir, çünkü bir dizini manuel olarak kaldırmaya çalışan biri değil, bir toplu komut dosyasından bahsediyoruz.
Harry Johnston

-1

Aşağıdaki olası nedenleri düşünebilirim:

  1. daha yüksek izinlere ihtiyaç duyan dosyalar veya alt dizinler var
  2. yalnızca WSearch tarafından değil, virüs tarayıcınız veya başka herhangi bir şey tarafından kullanımda olan dosyalar var

1. için) deneyebilirsiniz runas /user:Administrator daha yüksek ayrıcalıklar elde etmeyi veya içerik menüsünden yönetici olarak toplu iş dosyasını başlatabilirsiniz. Bu yardımcı olmazsa, yönetici bile haklara sahip olmayabilir. Daha sonra dizinin sahipliğini devralmanız gerekir.

2.) İşlem Gezgini'ni indirmek için tıklayın Find/Find handle or DLL...veya tuşuna basın Ctrl+F, dizinin adını yazın ve onu kimin kullandığını bulun. Mümkünse dizini kullanan uygulamayı kapatın.


Makinelerde yönetici hesabı devre dışı bırakılmıştır. Yönetici grubundayım ancak yönetici şifresinden haberdar değilim. İzin sorununu aşmak için başka önerileriniz var mı? Birisi toplu işten başka bir programı çağırmaktan bahsetti (vba gibi).
Mayhem

@Mayhem: izinleri aşmak oldukça zor ... Windows'ta bunu şifre olmadan yapabilmek için büyük olasılıkla bir açıktan yararlanmaya ihtiyacımız olacaktır.
Thomas Weller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.