Muszę usunąć jeden folder zawierający inne foldery i pliki w środku. Próbowałem del
i rmdir
polecenia, ale czasami nie udaje się z niektórymi liniami błędów:[PATH]: The directory isn't empty.
Czy jest jakaś dobra alternatywa?
Muszę usunąć jeden folder zawierający inne foldery i pliki w środku. Próbowałem del
i rmdir
polecenia, ale czasami nie udaje się z niektórymi liniami błędów:[PATH]: The directory isn't empty.
Czy jest jakaś dobra alternatywa?
Odpowiedzi:
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 rmdir
polecenie 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 rmdir
mó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 rmdir
poleceniami. 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ć ping
pauzy:
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}
rm -rf /directory/
powinien być globalny we wszystkich systemach operacyjnych.
timeout /t 3
pause
polecenia).
Próbować:
rmdir /S your_directory
lub:
rmdir /S /Q your_directory
pomijać wiadomości potwierdzające.
del
i rmdir
nic nie pytam, po prostu wysyłają kilka wierszy, takich jak ten w opisie.
rmdir /s
usunie 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
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.
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 /q
dwa 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
Użyj del
plików wewnątrz, a następnie rmdir
usuń folder.
Aby użyć tej rmdir
metody również do usunięcia wszystkich plików, użyj /S
przełącznika przed nazwą katalogu i /Q
ukryj 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
Folder starszych wersji systemu Windows (DOS, Windows 95/98 / ME) DELTREE
jest odpowiednikiem RM
lub RMDIR
. DELTREE
Na 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.
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)"