Полностью удалить папку в 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
OT: Вот почему я ненавижу окна. Все так сложно. 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 

пропустить подтверждающие сообщения.

AndrewQ
источник
1
Я уже попробовал эти варианты, но, как я написал, delи rmdirничего не спрашивает, они просто отправляют несколько строк, как в описании.
Франческо Занини
2
rmdir /sудалит все, что можно удалить. У вас могут быть файлы, заблокированные программой, файлы только для чтения или файлы, для удаления которых вам необходим административный доступ. Нет ни одной команды, которая бы позаботилась обо всех этих ситуациях для вас
nvuono
Если вы по-прежнему получаете сообщения об ошибках, попробуйте использовать PowerShell: командлет Remove-Item немного мощнее, чем rmdir.
AndrewQ
1
rmdir / S <каталог> Удаляет каталог, субфоллеры и каталоги. Он также спрашивает, уверены ли вы. На 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

Если это по-прежнему не удается, либо у вас нет разрешения на удаление некоторых файлов, либо некоторые файлы все еще используются.

sgmoore
источник
Это должен быть правильный ответ!
jdhao
4

Я считаю, что есть ошибка в Windows 7 (и, возможно, в других версиях), которая иногда вызывает этот симптом; или это может быть ошибка в стороннем программном обеспечении. (У вас случайно установлен Symantec Endpoint Protection?)

Во всяком случае, я сталкивался с этим довольно часто. В большинстве случаев проблему можно обойти, выполнив 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
Добро пожаловать в СУ! Почему я проголосовал? 1) Плохое форматирование 2) Предоставляет то же существенное решение, которое было опубликовано несколько лет назад (всегда читайте опубликованные решения, прежде чем публиковать новое!) 3) Не подходит для вопроса (ваше решение воссоздает удаленную папку, которая не просили).
Загримсан