Jak rozwiązać błąd „Katalog nie jest pusty” podczas uruchamiania polecenia rmdir w skrypcie wsadowym?

92

Tworzę skrypt wsadowy i część skryptu próbuje usunąć katalog i wszystkie jego podkatalogi. Otrzymuję sporadyczny błąd dotyczący podkatalogu, który nie jest pusty. Przeczytałem jeden artykuł o tym, że winowajcą jest indeksowanie. Wyłączyłem WSearch, ale w końcu ponownie wystąpił błąd. Oto polecenie:

rmdir /S /Q "C:\<dir>\"
Okaleczenie
źródło
Czy mogę zapytać o typ plików, o których ostrzega Windows? U mnie dzieje się tak tylko w przypadku plików PDF wkrótce po ich przeniesieniu / skopiowaniu.
Jake Stevens-Haas

Odpowiedzi:

88

Doświadczyłem tych samych problemów, o których wspomniał Harry Johnston. rmdir /s /qnarzekałby, że katalog nie jest pusty, mimo że /sma to zrobić za Ciebie! Osobiście uważam, że to błąd w systemie Windows.

Moje obejście polega na tym, że delwszystko w katalogu przed usunięciem samego katalogu:

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

( 1>nulUkrywa standardowe wyjście, delponieważ w przeciwnym razie wyświetla każdy plik, który usuwa).

BoffinBrain
źródło
Wpadłem na scenariusz, w którym niektóre podkatalogi wewnątrz mydirgenerowały ten sam błąd „niepusty”. Więc musiałem cdwejść mydiri wykonać delna plikach w każdym z tych katalogów. Ostatecznie zadziałało, ale gdybym musiał powtórzyć ten proces po raz trzeci na innym poziomie, czułbym się dość pokonany.
gfullam
@gfullam O ile dobrze pamiętam, moja metoda powinna działać również na podkatalogach rekurencyjnych, niezależnie od głębokości. Tak właśnie del /sjest.
BoffinBrain
Używając eksploratora (prawdopodobnie również mkdir => NIE!), Dodając folder (i zmieniając jego nazwę) zakończ zadanie usuwania używając tylko rd /s /q mydirkomendy.
Master DJon
1
Okej, myślę, że usunięcie okien i przejście na Linuksa jest o wiele łatwiejsze niż ten ból :)
RajnishCoder,
1
@RajnishCoder Życie z systemem Windows to w zasadzie świat obejść. Ten konkretny problem jest niczym w porównaniu z innymi problemami z systemem Windows 10!
BoffinBrain
47

Znam ten problem. Najprostszym obejściem jest warunkowe powtórzenie operacji. Nigdy nie widziałem, żeby to zawodziło dwa razy z rzędu - chyba że rzeczywiście jest otwarty plik lub problem z uprawnieniami, oczywiście!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme
Harry Johnston
źródło
11
Święty Molly, to nie ma sensu, ale zadziałało. Co #!%#@! microsoft
Sam B
IF EXISTkryjówki Access is deniedi inne sytuacje. Dodałem coś podobnego DIR c:\deletemei sprawdzanie błędów przed wszystkim.
it3xl
Otwarcie eksploratora Windows w podkatalogu lub przeglądanie w inny sposób powoduje niepowodzenie dwa razy z rzędu. Więc upewnij się, że zapytasz o to po raz trzeci (co faktycznie zadziałało)
Jake Stevens-Haas
Właściwie to nie wystąpił dwa razy z rzędu dla mnie bez niczego otwartej lub problem uprawnienia. Mój rekord to siedem razy. Poleć podejście @ BoffinbraiN.
Jake Stevens-Haas
Uruchomiłem tylko pierwszą komendę. Następnie kliknij prawym przyciskiem myszy folder> Właściwości> Odznacz atrybut „Tylko do odczytu”> Zastosuj. Viola !, folder w końcu zniknął.
steven7mwesigwa
21

wprowadź wiersz polecenia jako administrator i uruchom

rmdir /s <FOLDER>
Adilson Cabral
źródło
2
Nie różni się to od tego, co robił PO.
Harry Johnston,
20

Właśnie napotkałem ten sam problem i był związany z utratą lub uszkodzeniem niektórych plików. Aby rozwiązać problem, po prostu uruchom check disk:

chkdsk /F e:

Można to uruchomić z okna wyszukiwania lub z wiersza polecenia cmd. /FRozwiązuje wszelkie problemy znalezione, jak odzyskanie plików. Po zakończeniu działania możesz usunąć pliki i foldery w zwykły sposób.

jrose
źródło
Idealnie, próbowałem od pół godziny
trex
To znalazło ukryte pliki w moim folderze, które następnie mogłem usunąć. Naprawdę paskudny 😑
Pokonaj
7

Miałem podobny problem, próbowałem usunąć pusty folder za pomocą eksploratora Windows. Pokazał mi nie pusty błąd, więc pomyślałem, że spróbuję przez admin cmd, ale żadna z odpowiedzi tutaj nie pomogła.

Po przeniesieniu pliku do pustego folderu. Udało mi się usunąć niepusty folder

Grisu118
źródło
1
Napisz to w komentarzu.
Virb
Ciekawy. Prawdopodobnie nie ma to jednak znaczenia dla scenariusza PO.
Harry Johnston
Holy moly, to była dosłownie jedyna myśl, która zadziałała ze wszystkich innych rozwiązań!
Seega
3

Jak stwierdził @gfullam w komentarzu do odpowiedzi @ BoffinbraiN, usuwany <dir>sam może nie być tym, który zawiera pliki: mogą w nim znajdować się podkatalogi, w <dir>których pojawia się komunikat „Katalog nie jest pusty”, a jedynym rozwiązaniem byłoby wtedy rekurencyjnie iteruj po katalogach, ręcznie usuwając wszystkie zawierające je pliki ... Ostatecznie zdecydowałem się użyć portu rmz UNIX. rm.exepochodzi z Git Bash, MinGW, Cygwin, GnuWin32 i innymi. Po prostu musisz mieć jego katalog nadrzędny w swojej PATH, a następnie wykonywać tak, jak w systemie UNIX.

Przykład skryptu wsadowego:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"
Gobe
źródło
2

To, co zadziałało, jest następujące. Wygląda na to, że polecenie RMDir prawie cały czas wyświetla komunikat „Katalog nie jest pusty” ...

: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
user7432246
źródło
2

Miałem „C: \ Users \ User Name \ OneDrive \ Fonts”, które zostało mklink'ed (/ D) do „C: \ Windows \ Fonts” i mam ten sam problem. W moim przypadku

cd „C: \ Users \ Nazwa użytkownika \ OneDrive”

rd / s Czcionki

Y (aby potwierdzić akcję)

pomogło mi. Mam nadzieję, że Tobie też pomoże; D.

Maciej Bledkowski
źródło
2
Dodaj / q, aby uniknąć konieczności potwierdzania podczas uruchamiania partii.
Jonathan Rosenne
1

W moim przypadku właśnie przeniosłem folder do katalogu głównego w ten sposób.

move <source directory> c:\

Następnie uruchomiono polecenie, aby usunąć katalog

rmdir c:\<moved directory> /s /q
Daniel Barde
źródło
2
rmdir c:\<moved directory> /s /qjest poprawna odpowiedź
lalengua
1
NIE jest to poprawna odpowiedź. usunięcie folderu w katalogu głównym może spowodować te same wiadomości: folder nie jest pusty.
Gangnus
Wiem, że to stary wątek. Chciałem tylko powiedzieć, że to zadziałało ...
Manuel Rivera
1

Przyczyną rd /sodmowy usunięcia niektórych plików są najprawdopodobniej atrybuty plików TYLKO DO ODCZYTU w plikach w katalogu.

Właściwym sposobem rozwiązania tego problemu jest upewnienie się, że najpierw zresetowałeś atrybuty wszystkich plików:

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

Mogą istnieć inne, takie jak pliki ukryte lub systemowe, więc jeśli chcesz grać bezpiecznie:

attrib -h -r -s %directory% /s /d
rd /s %directory%
Peter Hoeg
źródło
0

Podobnie jak odpowiedź Harry'ego Johnstona, zapętlam, aż zadziała.

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)
BuvinJ
źródło
0

System Windows czasami jest „zepsuty przez projekt”, więc musisz utworzyć pusty folder, a następnie utworzyć kopię lustrzaną „uszkodzonego folderu” z „pustym folderem” w trybie kopii zapasowej.

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

Utwórz pusty katalog w ten sposób:

mkdir empty

nadpisz uszkodzony folder pustym folderem w ten sposób:

robocopy /copyall /mir /b empty broken

a następnie usuń ten folder

rd broken /s
rd empty /s

Jeśli to nie pomoże, spróbuj uruchomić ponownie w „trybie odzyskiwania z wierszem poleceń”, przytrzymując klawisz Shift po kliknięciu przycisku Uruchom ponownie i próbując ponownie uruchomić to polecenie w trybie odzyskiwania

Kristijonas Grigorovičius
źródło
Tak, myślę, że Robocopy działałby w scenariuszu PO, ponieważ automatycznie ponawia nieudane operacje. Prawdopodobnie chcesz określić, /W:0aby uniknąć niepotrzebnych opóźnień. Możesz tego nie chcieć, /bponieważ wymaga to uprawnień administratora. Tryb odzyskiwania nie jest odpowiedni dla tego pytania, ponieważ mówimy o skrypcie wsadowym, a nie o kimś, kto ręcznie próbuje usunąć katalog.
Harry Johnston
-1

Przychodzą mi do głowy następujące możliwe przyczyny:

  1. istnieją pliki lub podkatalogi, które wymagają wyższych uprawnień
  2. są używane pliki, nie tylko przez WSearch, ale może przez twój skaner antywirusowy lub cokolwiek innego

W przypadku 1.) możesz spróbować runas /user:Administratoruzyskać wyższe uprawnienia lub uruchomić plik wsadowy jako administrator za pomocą menu kontekstowego. Jeśli to nie pomoże, może nawet administrator nie ma uprawnień. Następnie musisz przejąć prawo własności do katalogu.

2.) pobierz Process Explorer , kliknij Find/Find handle or DLL...lub naciśnij Ctrl+F, wpisz nazwę katalogu i dowiedz się, kto go używa. Jeśli to możliwe, zamknij aplikację korzystającą z katalogu.

Thomas Weller
źródło
Maszyny mają wyłączone konto administratora. Jestem w grupie administratorów, ale nie znam hasła administratora. Jakieś inne sugestie, jak obejść problem z pozwoleniami? Ktoś wspomniał o wywołaniu innego programu z wsadu (np. Vba).
Mayhem
@Mayhem: omijanie uprawnień jest dość trudne ... Prawdopodobnie potrzebowalibyśmy exploita na błąd w systemie Windows, aby zrobić to bez hasła.
Thomas Weller,