Вопрос

Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.

Есть ли готовый инструмент для этого, или мне нужно его написать?

DEL /S не удаляет каталоги.

DELTREE был удален из Windows 2000+

Это было полезно?

Решение

RMDIR или удаленный сервер, если вы используете классическую командную строку (cmd.exe):

rd /s /q "path"

Если вы используете PowerShell, вы можете использовать Remove-Item (который имеет псевдоним del, erase, rd, ri, rm и rmdir) и берет -Recurse аргумент, который может быть сокращен до -r

rd -r "path"

Другие советы

администратор:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Работает для всего, включая системные файлы

Редактировать:Я действительно нашел лучший способ, который также решает проблему слишком длинного пути к файлу:

mkdir \empty
robocopy /mir \empty folder

RMDIR [/С] [/Q] [drive:]path

RD [/С] [/Q] [drive:]path

  • /S Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.

  • /Q Тихий режим, не спрашивайте, можно ли удалить дерево каталогов с помощью /S

Вы можете установить cygwin, который имеет rm а также ls и т.д.

Перейдите к пути и запустите эту команду.

rd /s /q "FOLDER_NAME"

/с :Удаляет указанный каталог и все подкаталоги, включая любые файлы.Используйте /s для удаления дерева.

/q :Запускает rmdir в тихом режиме.Удаляет каталоги без подтверждения.

/?:Отображает справку в командной строке.

Для удаления каталога (независимо от того, существует он или нет) используйте следующее:

if exist myfolder ( rmdir /s/q myfolder )

rmdir /S /Q %DIRNAME%

имя файла rmdir /s

Попробуйте выполнить эту команду:

del /s foldername

Во-первых, давайте рассмотрим, что rm -rf делает:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Существует три сценария , в которых rm -rf обычно используется там, где ожидается, что он вернется 0:

  1. Указанный путь не существует.
  2. Указанный путь существует и является каталогом.
  3. Указанный путь существует и является файлом.

Я собираюсь проигнорировать всю эту историю с разрешениями, но в любом случае никто не использует разрешения и не пытается запретить себе доступ на запись к чему-либо в Windows (ОК, это должно быть шуткой ...).

Первый установленный ERRORLEVEL до 0 а затем удалите путь, только если он существует, используя разные команды в зависимости от того, является ли это каталогом. IF EXIST не устанавливает ERRORLEVEL равняется 0, если путь не существует, поэтому установка ERRORLEVEL сначала необходимо набрать 0, чтобы правильно определить успех способом, имитирующим обычный rm -rf использование.Охраняя RD с IF EXIST это необходимо, потому что RD, в отличие от rm -f, выдаст ошибку, если целевой объект не существует.

Следующий фрагмент сценария предполагает, что DELPATH предварительно заключен в кавычки.(Это безопасно, когда вы делаете что-то вроде SET DELPATH=%1.Попробуйте положить ECHO %1 в .cmd и передайте ему аргумент с пробелами в нем и посмотрите сами, что получится).После завершения работы с фрагментом вы можете проверить наличие сбоя с помощью IF ERRORLEVEL 1.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

Дело в том, что все проще, когда среда просто соответствует POSIX.Или, если вы установите минимальный MSYS и просто будете использовать его.

Вы можете установить GnuWin32 и используйте команды * nix изначально в Windows.Я устанавливаю это перед установкой чего-либо еще на мятную свежую копию Windows.:)

Вот что вам нужно сделать...

Создайте пакетный файл со следующей строкой

RMDIR /S %1

Сохраните ваш пакетный файл как Remove.bat и положи его в C:\windows

Создайте следующий раздел реестра

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Запуск regedit и обновите значение по умолчанию HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default со следующим значением

"c:\windows\REMOVE.bat" "%1"

Вот и все!Теперь вы можете щелкнуть правой кнопкой мыши по любому каталогу и использовать функцию RMDIR

Использование Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Заменить журналы с именем каталога, который вы хотите удалить.

get-дочерний элемент выполняет поиск дочернего каталога с именем рекурсивно по текущему пути (.).

удалить-элемент удаляет результат.

Принятый ответ великолепен, но предполагая, что у вас установлен Node, вы можете сделать это гораздо точнее с помощью библиотеки узлов "rimraf", которая позволяет изменять шаблоны.Если вы часто используете это (я использую), просто установите его глобально.

yarn global add rimraf

тогда, например, шаблон, который я использую постоянно:

rimraf .\**\node_modules

или для однострочника, который позволяет вам избежать глобальной установки, но который занимает немного больше времени для динамической загрузки пакета:

npx rimraf .\**\node_modules

вот что сработало у меня:

Просто попробуйте уменьшить длину пути.т.е. ::Переименуйте все папки, которые ведут к такому файлу, в минимально возможные имена.Произнесите имена из одной буквы.Продолжайте переименовывать вверх по иерархии папок.Таким образом, вы эффективно уменьшаете длину пути.Теперь, наконец, попробуйте удалить файл сразу.

через Powershell

 Remove-Item -Recurse -Force "TestDirectory"

через Командную строку

https://stackoverflow.com/a/35731786/439130

ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК.ИНФОРМАЦИЯ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ".НЕ ТЕСТИРОВАЛСЯ ШИРОКО.

Щелкните правой кнопкой мыши значок Windows (обычно внизу слева) > выберите "Windows PowerShell (администратор)" > используйте эту команду (при должной осторожности вы можете легко удалить все свои файлы, если не будете осторожны):

rd -r -include *.* -force somedir

Где somedir это непустой каталог, который вы хотите удалить.

Обратите внимание, что с внешними подключенными дисками или дисками с проблемами Windows иногда ведет себя странно - она не выдает ошибку при удалении (или любой попытке копирования), однако каталог не удаляется (или не копируется) в соответствии с инструкциями.(Я обнаружил, что в этом случае, по крайней мере для меня, команда, данная @n_y в его ответе, приведет к ошибкам типа 'get-childitem :Файл или каталог поврежден и нечитаем". в результате в PowerShell)

Существует также deltree, если вы используете более старую версию Windows.

Мне очень нравится этот сайт для поиска команд:SS64:Del - Удалять файлы

каталог del /s /q удален

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top