Bagaimana mengatasi kesalahan "Direktori tidak kosong" saat menjalankan perintah rmdir dalam skrip batch?

92

Saya membuat skrip batch dan bagian dari skrip mencoba untuk menghapus direktori dan semua sub-direktorinya. Saya mendapatkan pesan kesalahan intermiten tentang sub-direktori yang tidak kosong. Saya membaca satu artikel tentang pengindeksan sebagai pelakunya. Saya menonaktifkan WSearch tetapi akhirnya saya mendapatkan kesalahan lagi. Inilah perintahnya:

rmdir /S /Q "C:\<dir>\"
Kekacauan
sumber
Dapatkah saya menanyakan beberapa info tentang jenis file yang memberi tahu Anda tentang windows? Bagi saya, ini hanya terjadi dengan file PDF segera setelah saya memindahkan / menyalinnya.
Jake Stevens-Haas

Jawaban:

88

Saya mengalami masalah yang sama seperti yang dikatakan Harry Johnston. rmdir /s /qakan mengeluh bahwa direktori tidak kosong meskipun /sdimaksudkan untuk melakukan pengosongan untuk Anda! Saya pikir itu bug di Windows, secara pribadi.

Solusi saya adalah untuk delsemua yang ada di direktori sebelum menghapus direktori itu sendiri:

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

(The 1>nulmenyembunyikan output standar delkarena jika tidak, itu mencantumkan setiap file yang dihapusnya.)

BoffinBrain
sumber
Saya mengalami skenario di mana beberapa sub direktori di dalamnya mydirmenghasilkan kesalahan "tidak kosong" yang sama. Jadi saya harus cdmasuk mydirdan menjalankan delfile di setiap direktori tersebut juga. Pada akhirnya itu berhasil, tetapi jika saya harus mengulangi proses itu untuk ketiga kalinya di sublevel lain, saya akan merasa sangat kalah.
gfullam
@gfullam Sejauh yang saya ingat, metode saya harus bekerja pada subdirektori rekursif juga, untuk kedalaman apa pun. Itulah yang del /sdilakukannya.
BoffinBrain
Menggunakan explorer (mungkin juga mkdir => NO!), Menambahkan folder (dan mengubah nama) menyelesaikan pekerjaan penghapusan hanya dengan menggunakan rd /s /q mydirperintah.
Master DJ
1
Oke, saya pikir menghapus windows dan pindah ke Linux jauh lebih mudah daripada rasa sakit ini :)
RajnishCoder
1
@RajnishCoder Hidup dengan Windows pada dasarnya adalah dunia solusi. Masalah khusus ini tidak seberapa dibandingkan dengan masalah lain dengan Windows 10!
BoffinBrain
47

Saya akrab dengan masalah ini. Solusi paling sederhana adalah mengulangi operasi secara bersyarat. Saya belum pernah melihatnya gagal dua kali berturut-turut - kecuali sebenarnya ada file terbuka atau masalah izin, jelas!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme
Harry Johnston
sumber
11
Sialan, ini tidak masuk akal namun berhasil. Apa #!% # @! microsoft
Sam B
IF EXISTmenyembunyikan Access is denieddan situasi lainnya. Saya telah menambahkan sesuatu seperti DIR c:\deletemedan pengecekan kesalahan sebelum semuanya.
it3xl
Membuka windows explorer di subdirektori atau browsing menyebabkan ini gagal dua kali berturut-turut. Jadi pastikan Anda menanyakannya untuk ketiga kalinya (yang benar-benar berhasil)
Jake Stevens-Haas
Sebenarnya ini telah terjadi dua kali berturut-turut untuk saya tanpa ada masalah terbuka atau masalah izin. Rekor saya tujuh kali. Rekomendasikan pendekatan @ BoffinbraiN.
Jake Stevens-Haas
Saya hanya menjalankan perintah pertama. Kemudian klik kanan folder> Properties> Hapus centang pada atribut 'Read-only'> Apply. Viola !, folder tersebut akhirnya menghilang.
steven7mwesigwa
21

Saya baru saja mengalami masalah yang sama dan itu berkaitan dengan beberapa file yang hilang atau rusak. Untuk memperbaiki masalah ini, jalankan saja check disk:

chkdsk /F e:

Ini dapat dijalankan dari kotak jendela pencarian atau dari prompt cmd. The /Fperbaikan masalah yang ditemukan, seperti memulihkan file. Setelah ini selesai dijalankan, Anda dapat menghapus file dan folder seperti biasa.

jrose
sumber
Sempurna, saya mencoba sejak setengah jam
trex
Ini menemukan beberapa file tersembunyi di folder saya, yang kemudian dapat saya hapus. Benar-benar buruk 😑
Kalahkan
21

masuk ke Command Prompt sebagai Admin dan jalankan

rmdir /s <FOLDER>
Adilson Cabral
sumber
2
Ini tidak berbeda dengan apa yang dilakukan OP.
Harry Johnston
7

Saya memiliki masalah yang sama, mencoba menghapus folder kosong melalui windows explorer. Menunjukkan kepada saya kesalahan yang tidak kosong, jadi saya pikir saya mencobanya melalui admin cmd, tetapi tidak ada jawaban di sini yang membantu.

Setelah saya memindahkan file ke folder kosong. Saya dapat menghapus folder yang tidak kosong

Grisu118
sumber
1
Silakan tulis di komentar.
Virb
Menarik. Mungkin tidak relevan dengan skenario OP.
Harry Johnston
Sialan, ini benar-benar satu-satunya pemikiran yang berhasil dari semua solusi lain ini!
Seega
3

Seperti yang @gfullam nyatakan dalam komentar untuk jawaban @ BoffinbraiN, yang <dir>Anda hapus sendiri mungkin bukan yang berisi file: mungkin ada subdirektori di dalamnya <dir>yang mendapatkan pesan "Direktori tidak kosong" dan satu-satunya solusi adalah berulang-ulang di atas direktori, secara manual menghapus semua file yang memuatnya ... Saya akhirnya memutuskan untuk menggunakan port rmdari UNIX. rm.exedilengkapi dengan Git Bash, MinGW, Cygwin, GnuWin32, dan lainnya. Anda hanya perlu memiliki direktori induknya di PATH Anda dan kemudian menjalankannya seperti yang Anda lakukan di sistem UNIX.

Contoh skrip batch:

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

Apa yang berhasil bagi saya adalah sebagai berikut. Sepertinya perintah RMDir akan mengeluarkan "Direktori tidak kosong" hampir sepanjang waktu ...

: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
pengguna7432246
sumber
2

Saya memiliki "C: \ Users \ User Name \ OneDrive \ Fonts", yang ditautkan (/ D) ke "C: \ Windows \ Fonts", dan saya mendapat masalah yang sama. Dalam kasus saya

cd "C: \ Users \ Nama Pengguna \ OneDrive"

rd / s Font

Y (untuk mengkonfirmasi tindakan)

membantuku. Saya harap, ini juga membantu Anda; D

Maciej Bledkowski
sumber
2
Tambahkan / q untuk menghindari kebutuhan konfirmasi saat menjalankan batch.
Jonathan Rosenne
1

Saya kasus saya, saya baru saja memindahkan folder ke direktori root seperti itu.

move <source directory> c:\

Dan kemudian jalankan perintah untuk menghapus direktori

rmdir c:\<moved directory> /s /q
Daniel Barde
sumber
2
rmdir c:\<moved directory> /s /qadalah jawaban yang benar
lalengua
1
Ini BUKAN jawaban yang benar. menghapus folder di root dapat menyebabkan pesan yang sama: folder tidak kosong.
Gangnus
Saya tahu ini adalah utas lama. Hanya ingin mengatakan ini berhasil untuk saya ...
Manuel Rivera
1

Alasan rd /smenolak untuk menghapus file tertentu kemungkinan besar karena atribut file READONLY pada file di direktori.

Cara yang tepat untuk memperbaikinya adalah dengan memastikan Anda mengatur ulang atribut pada semua file terlebih dahulu:

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

Mungkin ada yang lain seperti file tersembunyi atau sistem, jadi jika Anda ingin bermain aman:

attrib -h -r -s %directory% /s /d
rd /s %directory%
Peter Hoeg
sumber
0

Mirip dengan jawaban Harry Johnston, saya berputar hingga berhasil.

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

Terkadang Windows "rusak karena desain", jadi Anda perlu membuat folder kosong, lalu mencerminkan "folder yang rusak" dengan "folder kosong" dengan mode cadangan.

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

Buat dir kosong seperti ini:

mkdir empty

timpa folder yang rusak dengan yang kosong seperti ini:

robocopy /copyall /mir /b empty broken

lalu hapus folder itu

rd broken /s
rd empty /s

Jika ini tidak membantu, coba mulai ulang dalam "mode pemulihan dengan prompt perintah" dengan menahan shift saat mengklik mulai ulang dan mencoba menjalankan perintah ini lagi dalam mode pemulihan

Kristijonas Grigorovičius
sumber
Ya, saya pikir Robocopy akan bekerja dalam skenario OP, karena secara otomatis mencoba lagi operasi yang gagal. Anda mungkin ingin menentukan /W:0untuk menghindari penundaan yang tidak perlu. Anda mungkin tidak mau /bkarena itu membutuhkan hak akses administratif. Mode pemulihan tidak relevan dengan pertanyaan ini, karena kita berbicara tentang skrip batch, bukan seseorang yang mencoba menghapus direktori secara manual.
Harry Johnston
-1

Saya dapat memikirkan kemungkinan penyebab berikut:

  1. ada file atau subdirektori yang membutuhkan izin lebih tinggi
  2. ada file yang sedang digunakan, tidak hanya oleh WSearch, tapi mungkin oleh pemindai virus Anda atau yang lainnya

Untuk 1.) Anda dapat mencoba runas /user:Administratoruntuk mendapatkan hak istimewa yang lebih tinggi atau memulai file batch sebagai administrator melalui menu konteks. Jika itu tidak membantu, bahkan mungkin administrator tidak memiliki hak. Kemudian Anda perlu mengambil alih kepemilikan direktori.

Untuk 2.) unduh Process Explorer , klik Find/Find handle or DLL...atau tekan Ctrl+F, ketik nama direktori dan cari tahu siapa yang menggunakannya. Tutup aplikasi yang menggunakan direktori, jika memungkinkan.

Thomas Weller
sumber
Mesin telah menonaktifkan akun admin. Saya berada di grup admin tetapi saya tidak mengetahui kata sandi administrator. Ada saran lain untuk mengatasi masalah izin? Seseorang menyebutkan memanggil program lain dari batch (seperti vba).
Mayhem
@ Mayhem: mendapatkan izin cukup sulit ... Kami mungkin memerlukan exploit untuk bug di Windows untuk melakukannya tanpa kata sandi.
Thomas Weller