Повністю видаліть папку в Windows за допомогою командного рядка


57

Мені потрібно видалити одну папку, що містить інші папки та файли всередині. Я спробував delі rmdirкоманди, але іноді вони не вдається з деякими рядками помилок:[PATH]: The directory isn't empty.

Чи є якась хороша альтернатива?


Я відчував непослідовність у тому, чи rmdir з відповідними прапорами видаляє все з дерева каталогів (та / або саме дерево), і єдине можливе пояснення, яке я маю, - це те, що говорить Гаррі Джонстон.
r_alex_hall

Відповіді:


15

Це трапляється зі мною багато з моїми сценаріями автоматизованого збирання.

Я думаю, що причиною може бути деяка програма, у якій в цьому каталозі відкритий файл із "поділитись видаленням". Тобто програма дозволяє видалити файл (саме тому я вважаю, що виклик 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}

На мій досвід, пауза ніколи не потрібна, але YMMV. (Звичайно, якщо в грі справді є інша програма, бажано її визначити і явно чекати, коли вона вийде, якщо це можливо.)
Гаррі Джонстон

Ну ... я реалізував 10-кратну петлю повтору з однією секундою затримки на повторне. Працює зараз. Я не збираюся намагатися зняти паузу, тільки щоб побачити її знову не вдалося :-) Звичайно, це не означає, що це необхідно. Просто бути дуже обережним.
Пол Грок

2
ОТ: Тому я ненавиджу вікна. Все так важко. rm -rf /directory/має бути глобальним для всіх операційних систем.

2
Насправді існує різновид команди «пауза»; для паузи на три секунди ви можете скористатися цим:timeout /t 3
r_alex_hall

@r_alex_hall Дійсно (але, як правило, лише з Vista, XP і раніше не мають pauseкоманди).
misha256

57

Спробуйте:

rmdir /S your_directory

або:

rmdir /S /Q your_directory 

щоб пропустити повідомлення підтвердження.


1
Я вже пробував ці варіанти, але, як я писав, delі rmdirнічого не запитую, вони просто надсилають деякі рядки, як той, який описаний.
Франческо Заніні

2
rmdir /sвидалить усе, що можна видалити. У вас можуть бути файли, які заблоковані програмою, файли лише для читання або файли, для видалення яких вам потрібен адміністративний доступ. Немає жодної команди, яка б опікувалася всіма тими ситуаціями
nvuono

Якщо ви все ще отримуєте повідомлення про помилки, спробуйте з PowerShell: командлет Remove-Item cmdlet це трохи потужніше, ніж rmdir.
AndrewQ

1
rmdir / S <directory> Видаляє каталог і підтеки та каталоги. Це також запитує Ви впевнені. У Windows 10. Спасибі
Jasmeet

1
@r_alex_hall RMDIR / s дійсно видаляє файли в каталогах. Але DEL / s видалить лише файли та збереже каталоги, саме тому RMDIR - кращий варіант
JCH2k

11

У вас можуть бути лише файли для читання, ви можете скористатися опцією del / F, щоб позбутися від них за допомогою

     del /S /F your_directory
     rmdir your_directory

У вас також можуть бути кілька прихованих файлів, і якщо ви дійсно впевнені, що хочете їх видалити, ви можете зробити це за допомогою

     del /S /F /AH your_directory
     rmdir your_directory

Якщо це все-таки не вдається, ви або не маєте дозволу на видалення деяких файлів, або деякі з них все ще використовуються.


Це має бути правильна відповідь!
jdhao

4

Я вважаю, що в 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

Домовились. Використання rd / s foo - це без опції / q silent - видалить усі допоміжні папки для вас, але ви повинні відповісти Y на підказку, тому потрібно брати участь у пакетних файлах. Менш ідеального я знаю.
Ентоні

3

Використовуйте delфайли всередині, потім rmdirвидаліть папку.

Щоб також використовувати rmdirметод видалення всіх файлів, використовуйте /Sперемикач перед назвою каталогу та /Qпридушуйте запит на видалення. Це найкращий спосіб зробити це, оскільки ви не пропустите жодних файлів. Будьте обережні, використовуючи перемикач / Q, оскільки він не попередить вас про атрибути файлів системи або прихованих файлів


2

Якщо ви використовуєте вузол, ви можете використовувати залежність rimraf так:

запустіть встановлення: npm install rimraf -g

видалити папку: rimraf SourceFolder

Це допомогло мені отримати помилку:

імена вихідних файлів більше, ніж підтримується файловою системою


0

Папка старих версій 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.

0

Я думаю, ви можете використовувати це так:

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)"

1
Ласкаво просимо до SU! Чому я подав заяву? 1) Погане форматування 2) Забезпечує те саме важливе рішення, яке було розміщено кілька років тому (завжди читайте опубліковані рішення перед тим, як публікувати нове!) 3) Не підходить для запитання (ваше рішення відтворює видалену папку, яка не просили).
загримсан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.