Całkowicie usuń folder w systemie Windows za pomocą wiersza polecenia

57

Muszę usunąć jeden folder zawierający inne foldery i pliki w środku. Próbowałem deli rmdirpolecenia, ale czasami nie udaje się z niektórymi liniami błędów:[PATH]: The directory isn't empty.

Czy jest jakaś dobra alternatywa?

Francesco Zanini
źródło
Doświadczyłem niespójności, czy rmdir z odpowiednimi flagami usuwa wszystko z drzewa katalogów (i / lub samego drzewa), a jedynym możliwym wyjaśnieniem jest to, co mówi Harry Johnston.
r_alex_hall

Odpowiedzi:

15

Zdarza mi się to często z moimi zautomatyzowanymi skryptami kompilacji.

Myślę, że powodem może być aplikacja, która ma otwarty plik w tym katalogu z „share delete”. Oznacza to, że aplikacja pozwala na usunięcie pliku (dlatego uważam, że wywołanie DeleteFile nie kończy się niepowodzeniem), ale plik zniknie dopiero po zamknięciu uchwytu przez aplikację.

Oznacza to, że plik może nadal tam być, gdy rmdirpolecenie próbuje usunąć folder, stąd komunikat o błędzie. Wkrótce potem wspomniana aplikacja zamknie uchwyt, plik zniknie, a gdy przejrzysz folder, aby zobaczyć, który plik rmdirmówi, będzie pusty.

Przynajmniej taka jest moja teoria.

Obejście zaproponowane przez Harry'ego Johnstona wygląda dobrze. Tylko ja wstawiłbym pauzę między rmdirpoleceniami. Oczywiście system Windows nie ma łatwego do skryptu polecenia „pauza” (korekta: starożytne wersje systemu Windows nie, nowsze mają - patrz komentarze). Ale jeśli wystarczająca jest szczegółowość sekund, można użyć pingpauzy:

ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul

Łącznie:

rd /s /q foo
:: retry once
if exist foo (
    :: clear errorlevel
    cmd /c
    :: pause
    ping -n 2 127.0.0.1 >nul
    :: retry
    rd /s /q foo
)
:: retry yet again
if exist foo (
    cmd /c
    ping -n 2 127.0.0.1 >nul
    rd /s /q foo
)
:: give up
if exist foo {panic}
Paul Groke
źródło
Z mojego doświadczenia wynika, że ​​przerwa nie jest nigdy konieczna, ale YMMV. (Oczywiście, jeśli naprawdę jest w użyciu inna aplikacja, lepiej ją zidentyfikować i wyraźnie poczekać, aż wyjdzie, jeśli to możliwe.)
Harry Johnston,
Cóż ... Zaimplementowałem 10-krotną pętlę ponownych prób z jednym sekundowym opóźnieniem na powtórzenie. Działa teraz. Nie zamierzam próbować usuwać pauzy, tylko po to, aby zobaczyć, jak znów się nie udaje :-) Oczywiście to nie znaczy, że jest to konieczne. Po prostu jestem bardzo ostrożny.
Paul Groke,
2
OT: Dlatego nienawidzę okien. Wszystko jest takie trudne. rm -rf /directory/powinien być globalny we wszystkich systemach operacyjnych.
2
W rzeczywistości istnieje rodzaj polecenia „pauza”; aby zatrzymać trzy sekundy, możesz użyć tego:timeout /t 3
r_alex_hall
@r_alex_hall Rzeczywiście (ale natywnie tylko od Visty, XP i wcześniejsze nie mają tego pausepolecenia).
misha256
57

Próbować:

rmdir /S your_directory

lub:

rmdir /S /Q your_directory 

pomijać wiadomości potwierdzające.

AndrewQ
źródło
1
Próbowałem już tych opcji, ale jak napisałem deli rmdirnic nie pytam, po prostu wysyłają kilka wierszy, takich jak ten w opisie.
Francesco Zanini,
2
rmdir /susunie wszystko, co jest możliwe do usunięcia. Możesz mieć pliki zablokowane przez program, pliki tylko do odczytu lub pliki, które potrzebujesz dostępu administracyjnego, aby je usunąć. Nie ma jednego polecenia, które
zająłoby się
Jeśli nadal pojawiają się komunikaty o błędach, spróbuj za pomocą programu PowerShell: polecenie cmdlet Remove-Item jest nieco wydajniejsze niż rmdir.
AndrewQ,
1
rmdir / S <katalog> Usuwa katalog oraz podfolery i katalogi. Pyta również Czy jesteś pewien. W systemie Windows 10. Dzięki
Jasmeet,
1
@r_alex_hall RMDIR / s rzeczywiście usuwa pliki z katalogów. Ale DEL / s usunie tylko pliki i zachowa katalogi, dlatego RMDIR jest lepszą opcją
JCH2k
11

Możesz mieć tylko pliki do odczytu, możesz użyć opcji del / F, aby się ich pozbyć

     del /S /F your_directory
     rmdir your_directory

Możesz również mieć ukryte pliki, a jeśli naprawdę jesteś pewien, że chcesz je usunąć, możesz to zrobić za pomocą

     del /S /F /AH your_directory
     rmdir your_directory

Jeśli to nadal się nie powiedzie, oznacza to, że nie masz uprawnień do usunięcia niektórych plików lub niektóre z nich są nadal w użyciu.

sgmoore
źródło
To powinna być poprawna odpowiedź!
jdhao,
4

Uważam, że w systemie Windows 7 (i być może w innych wersjach) występuje błąd, który czasami powoduje ten objaw; lub może to być błąd w oprogramowaniu innej firmy. (Czy masz przypadkowo zainstalowany program Symantec Endpoint Protection?)

W każdym razie natknąłem się na to dość często. W większości przypadków problem można obejść, uruchamiając rd /s /qdwa lub trzy razy pod rząd.

Jeśli jest to plik wsadowy, możesz zrobić coś takiego:

rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Harry Johnston
źródło
Zgoda. Użycie rd / s foo - bez opcji cichej / q - usunie wszystkie podfoldery, ale musisz odpowiedzieć na pytanie Y, więc wymaga udziału plików wsadowych. Wiem mniej niż idealnie.
Anthony
3

Użyj delplików wewnątrz, a następnie rmdirusuń folder.

Aby użyć tej rmdirmetody również do usunięcia wszystkich plików, użyj /Sprzełącznika przed nazwą katalogu i /Qukryj monit o usunięcie. Jest to najlepszy sposób, aby to zrobić, ponieważ nie tracisz żadnych plików. Zachowaj ostrożność przy użyciu przełącznika / Q, ponieważ nie ostrzeże Cię on przed atrybutami System lub Ukryty plik

Kanadyjczyk Luke REINSTATE MONICA
źródło
2

Jeśli używasz węzła , możesz użyć zależności rimraf w następujący sposób:

uruchom instalację: npm install rimraf -g

Usunięty folder: rimraf SourceFolder

Pomogło mi to po otrzymaniu błędu:

nazwy plików źródłowych są większe niż obsługiwane przez system plików

Dustin Spengler
źródło
0

Folder starszych wersji systemu Windows (DOS, Windows 95/98 / ME) DELTREEjest odpowiednikiem RMlub RMDIR. DELTREENa mojej stacji roboczej z systemem Windows 7 używam jednak plików wsadowych.

Deletes a directory and all the subdirectories and files in it.

To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y              Suppresses prompting to confirm you want to delete
                  the subdirectory.
  [drive:]path    Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Słońce
źródło
0

Myślę, że możesz użyć tego w następujący sposób:

msg*your file is going to delete 
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\" 
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"
Shubham Dwivedi
źródło
1
Witamy w SU! Dlaczego przegłosowałem? 1) Złe formatowanie 2) Zapewnia to samo podstawowe rozwiązanie, które zostało już opublikowane kilka lat temu (zawsze czytaj opublikowane rozwiązania przed opublikowaniem nowego!) 3) Nie pasuje do pytania (twoje rozwiązanie odtwarza usunięty folder, który nie został poproszony).
zagrimsan