Мені потрібно видалити одну папку, що містить інші папки та файли всередині. Я спробував del
і rmdir
команди, але іноді вони не вдається з деякими рядками помилок:[PATH]: The directory isn't empty.
Чи є якась хороша альтернатива?
Мені потрібно видалити одну папку, що містить інші папки та файли всередині. Я спробував del
і rmdir
команди, але іноді вони не вдається з деякими рядками помилок:[PATH]: The directory isn't empty.
Чи є якась хороша альтернатива?
Відповіді:
Це трапляється зі мною багато з моїми сценаріями автоматизованого збирання.
Я думаю, що причиною може бути деяка програма, у якій в цьому каталозі відкритий файл із "поділитись видаленням". Тобто програма дозволяє видалити файл (саме тому я вважаю, що виклик DeleteFile не виходить з ладу), але файл зникне лише після закриття зазначеної програми.
Це означає, що файл все ще може бути там, коли rmdir
команда намагається видалити папку, отже, повідомлення про помилку. Незабаром після цього згадана програма закриє свою обробку, файл зникне, і коли ви оглянете папку, щоб побачити, про який файл rmdir
йде мова, він буде порожнім.
Принаймні, це моя теорія.
Запропонований Гаррі Джонстоном спосіб вирішення виглядає добре. Тільки я би вставив паузу між rmdir
командами. Звичайно, у Windows немає легко написаної команди "пауза" (виправлення: старі версії Windows не мають, новіші - див. Коментарі). Але якщо деталізації в секундах достатньо, можна ping
створити паузу:
ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul
Так в цілому:
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/
має бути глобальним для всіх операційних систем.
timeout /t 3
pause
команди).
Спробуйте:
rmdir /S your_directory
або:
rmdir /S /Q your_directory
щоб пропустити повідомлення підтвердження.
del
і rmdir
нічого не запитую, вони просто надсилають деякі рядки, як той, який описаний.
rmdir /s
видалить усе, що можна видалити. У вас можуть бути файли, які заблоковані програмою, файли лише для читання або файли, для видалення яких вам потрібен адміністративний доступ. Немає жодної команди, яка б опікувалася всіма тими ситуаціями
У вас можуть бути лише файли для читання, ви можете скористатися опцією del / F, щоб позбутися від них за допомогою
del /S /F your_directory
rmdir your_directory
У вас також можуть бути кілька прихованих файлів, і якщо ви дійсно впевнені, що хочете їх видалити, ви можете зробити це за допомогою
del /S /F /AH your_directory
rmdir your_directory
Якщо це все-таки не вдається, ви або не маєте дозволу на видалення деяких файлів, або деякі з них все ще використовуються.
Я вважаю, що в Windows 7 (і, можливо, в інших версіях) є помилка, яка іноді викликає цей симптом; або це може бути помилка в сторонній програмі. (У вас випадково встановлений захист кінцевої точки Symantec?)
У всякому разі, я стикався з цим досить часто. У більшості випадків проблему можна вирішити, виконуючи rd /s /q
два-три рази поспіль.
Якщо це в пакетному файлі, ви можете зробити щось подібне:
rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Використовуйте del
файли всередині, потім rmdir
видаліть папку.
Щоб також використовувати rmdir
метод видалення всіх файлів, використовуйте /S
перемикач перед назвою каталогу та /Q
придушуйте запит на видалення. Це найкращий спосіб зробити це, оскільки ви не пропустите жодних файлів. Будьте обережні, використовуючи перемикач / Q, оскільки він не попередить вас про атрибути файлів системи або прихованих файлів
Папка старих версій Windows (DOS, Windows 95/98 / ME) DELTREE
є еквівалентом RM
або RMDIR
. DELTREE
Хоча я добре використовую свою робочу станцію Windows 7 у пакетних файлах.
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.
Я думаю, ви можете використовувати це так:
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)"