Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.
Есть ли для этого готовый инструмент или мне нужно его написать?
DEL /S не удаляет каталоги.
DELTREE был удален из Windows 2000+
@Aaron, ответьте c, вам нужно использовать rmdir / s для удаления каталогов и файлов.





rmdir / s имя каталога
Попробуйте эту команду:
del /s foldername
работал у меня в сочетании с rmdir / s / q, поскольку некоторые файлы были заблокированы, и rmdir не работал с ними. del / foldername уничтожил заблокированные файлы, что позволило rmdir избавиться от корневого каталога. Отлично.
RMDIR или RD, если вы используете классическую командную строку (cmd.exe):
rd /s /q "path"
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
/Q Quiet mode, do not ask if ok to remove a directory tree with /S
Если вы используете PowerShell, вы можете использовать Remove-Item (который имеет псевдоним del, erase, rd, ri, rm и rmdir) и принимает аргумент -Recurse, который может быть сокращен до -r
rd -r "path"
Стоит отметить, что для большого количества файлов rmdir / s / q обычно значительно быстрее, чем эквивалентная операция «select dir, shift + delete» в проводнике.
Как насчет использования флагов для сопоставления имен каталогов? Если я хочу удалить все каталоги в foo \, rmdir /s /q foo\* выдает ошибку из-за неправильного синтаксиса.
Это не удаляет файлы, как это делает rm -rf, а также возвращает ненулевое значение, когда каталог не существует, поэтому rd /s /q foo && echo "yay" завершится ошибкой, если каталог «foo» не существует.
@Derek, Doskey может помочь вам создать псевдонимы для ls = dir: devblog.point2.com/2010/05/14/…
Что, если реж. не пусто и одни файлы получают Access is denied, а другие The process cannot access the file because it is being used by another process?
Я как раз на семерке пробовал и нужно делать / S и / Q (заглавные буквы)
Мистифицировано здесь. Я знать, что я пробовал эту команду, и она не работала, если в дереве каталогов были файлы; теперь возвращаюсь и. . . похоже, что это работает волшебным образом. Кто-нибудь еще испытывает непоследовательное поведение с этим ?!
Да, я постоянно сталкиваюсь с непоследовательным поведением. Он говорит, что не может удалить каталог, потому что он заблокирован каким-то процессом. Но нет процессов, блокирующих каталог.
Используйте if exist myfolder ( rmdir /s/q myfolder ), если вы не знаете, будет ли папка существовать или нет
Кажется, это не работает в PowerShell? Я получаю «Не найден позиционный параметр, который принимает аргумент '/ q'».
@JonGunter для Powershell вы используете командлет Remove-Item msdn.microsoft.com/en-us/powershell/reference/5.1/…
Возможно, это сработало в некоторых старых окнах. Но теперь это совсем не работает.
help rmdir в Windows 7 указывает, что /S следует использовать для удаления всего дерева каталогов, а /Q следует использовать для тихого режима.
rmdir /S /Q %DIRNAME%
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.
/Q Тихий режим, не спрашивайте, можно ли удалить дерево каталогов с помощью /S
Спасибо за объяснение параметров. Принятый ответ, к сожалению, этого не делает.
Самый простой, идеальный ответ на вопрос. Должен быть принятым.
Вы можете установить cygwin, у которого есть rm, ls и т. д.
Существует также deltree, если вы используете более старую версию Windows.
Вы можете узнать об этом больше здесь: SS64: DELTREE - удалить все подпапки и файлы.
админ:
takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder
Работает со всем, включая файлы sys
Обновлено: Я действительно нашел лучший способ, который также решает проблему слишком длинного пути к файлу:
mkdir \empty
robocopy /mir \empty folder
Мой герой! И один совет: вы создаете свою пустую папку в C: \ empty, а затем, оказавшись внутри каждой сумасшедшей папки, можно просто сделать robocopy /mir c:\empty .
takeown помог мне, поскольку я по ошибке скопировал папку из системы Linux с помощью rsync, и у меня не было прав на удаление этой папки ... Даже robocopy не работал. Спасибо
Очень хороший ответ. Оно работает. (все остальные ответы на странице - нет). Но cacls устарел. Можно ли дать современный ответ, пожалуйста? Второй вариант уже работает и не является устаревшим.
Для меня это ничего не значит. Может кто-нибудь объяснить, как это должно работать? (robocopy) - может удалять содержимое папок, но не сами папки.
@wbkang, когда я запускаю cacls "C:\B" /c /G "ADMINNAME":F /T, я получаю No mapping between account names and security IDs was done.
@bilal замените adminname на имя вашей учетной записи.
Вы можете установить 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.
вот что сработало для меня:
Просто попробуйте уменьшить длину пути. ie :: Переименуйте все папки, которые ведут к такому файлу, на наименьшие возможные имена. Произнесите имена из одной буквы. Продолжайте переименовывать вверх по иерархии папок. Благодаря этому вы эффективно уменьшите длину пути. Теперь, наконец, попробуйте сразу же удалить файл.
Во-первых, давайте рассмотрим, что делает 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:
Я собираюсь проигнорировать всю эту проблему с разрешениями, но никто не использует разрешения и не пытается отказать себе в доступе на запись к вещам в 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 и просто воспользуетесь им.
каталог del / s / q удален
Попробуйте добавить описание / объяснение.
Идите по пути и активируйте эту команду.
rd /s /q "FOLDER_NAME"
/ s: удаляет указанный каталог и все подкаталоги, включая любые файлы. Используйте / s, чтобы удалить дерево.
/ q: запускает rmdir в тихом режиме. Удаляет каталоги без подтверждения.
/? : Отображает справку в командной строке.
Для удаления каталога (независимо от того, существует он или нет) используйте следующее:
if exist myfolder ( rmdir /s/q myfolder )
Собственно это и есть ответ. Спасибо @Clay
Использование Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Замените журналы именем каталога, который вы хотите удалить.
Get-childitem ищет дочерний каталог с именем рекурсивно из текущего пути (.).
Убрать предмет удаляет результат.
через Powershell
Remove-Item -Recurse -Force "TestDirectory"
через командную строку
Принятый ответ хорош, но если у вас установлен Node, вы можете сделать это гораздо точнее с помощью библиотеки узлов rimraf, которая позволяет использовать шаблоны подстановки. Если вы используете это много (я), просто установите его глобально.
yarn global add rimraf
затем, например, шаблон, который я использую постоянно:
rimraf .\**\node_modules
или для однострочника, который позволяет избежать глобальной установки, но который занимает немного больше времени для динамической загрузки пакета:
npx rimraf .\**\node_modules
Надежное решение проблемы, поскольку он не зависит от ОС.
ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК. ИНФОРМАЦИЯ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ». ДОПОЛНИТЕЛЬНО НЕ ПРОВЕРЕНЫ.
Щелкните правой кнопкой мыши значок Windows (обычно внизу слева)> щелкните «Windows PowerShell (Admin)»> используйте эту команду (при должной осторожности вы можете легко удалить все свои файлы, если не будете осторожны):
rd -r -include *.* -force somedir
Где somedir - это непустой каталог, который вы хотите удалить.
Обратите внимание, что с внешними подключенными дисками или дисками с проблемами Windows иногда ведет себя странно - это не ошибка при удалении (или любой попытке копирования), но каталог не удаляется (или не копируется) в соответствии с инструкциями. (Я обнаружил, что в этом случае, по крайней мере, для меня, команда, заданная @n_y в его ответе, вызовет такие ошибки, как «get-childitem: файл или каталог поврежден и нечитаем». В результате в PowerShell)
ПОЗДНИЙ, НО ВАЖНЫЙ ОТВЕТ всем, у кого возникают проблемы с установкой пакетов npm на компьютере с Windows, и если вы видите ошибку с сообщением «rm -rf...», команда не найдена.
Вы можете использовать Баш Кли для запуска команды rm в Windows.
для пользователей npm вы можете изменить конфигурацию npm на npm config set script-shell "C:\Program Files\Git\bin\bash.exe" таким образом, если пакет npm, который вы пытаетесь установить, имеет сценарий после установки, который использует команду rm -rf, вы сможете запустить эту команду rm без необходимости изменять что-либо в пакете npm или отключение конфигурации сценариев после установки. (Например, styled-components использует команду rm в своих сценариях после установки)
Если вы хотите просто использовать команду rm, вы можете легко использовать bash и передавать аргументы.
Итак, да, вы можете использовать команду rm в Windows.
rm -r -fo <path>
является наиболее близким из возможных в Windows PowerShell. Это сокращение от
Remove-Item -Recurse -Force -Path <path>
Del / s (a) вообще не работает (он доступен только в некоторых версиях) или (b) покидает каталог верхнего уровня, но удаляет все, что находится под ним, или (c) оставляет все каталоги при удалении всех файлов?