эквивалент" rm-rf " для Windows?


мне нужен способ, чтобы рекурсивно удалить папку и ее детей.

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

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

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

18 339

18 ответов:

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

rd /s /q "path"

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

rd -r "path"

admin:

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

работает для всего, включая файлы sys

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

mkdir \empty
robocopy /mir \empty folder

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

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

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

  • /Q тихий режим, Не спрашивайте, если ok, чтобы удалить дерево каталогов с /S

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

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

rd /s /q "FOLDER_NAME"

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

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

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

rmdir /S /Q %DIRNAME%

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

if exist myfolder ( rmdir /s/q myfolder )

попробуйте эту команду:

del /s foldername

rmdir / s dirname

вы можете установить 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 функция

во-первых, давайте рассмотрим, что 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 в любом случае (ладно, это шутка...).

первый set 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 и просто используете его.

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

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

это приведет к удалению "моя папка" и ее содержимое без приглашения:

rd /s /q "C:\Users\jerry.g\AppData\Roaming\my folder"

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

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

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

get-childitem поиск дочернего каталога с именем рекурсивно из текущего пути (.).

remove-item удаляет результат.

есть также deltree, если вы находитесь на более старой версии windows.

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

del /s / q directorytobedeleted