Мне нужен способ рекурсивного удаления папки и ее дочерних элементов.
Для этого есть готовый инструмент или мне нужно написать его?
DEL/S
не удаляет каталоги.
DELTREE
был удален из Windows 2000+
RMDIR или RD, если вы используете классическую командную строку (cmd.exe):
rd /s /q "path"
Если вы используете PowerShell, вы можете использовать Remove-Item
(с псевдонимом del
, erase
, rd
, ri
, rm
и rmdir
) и принимает аргумент -Recurse
который может быть закорочен на -r
rd -r "path"
rmdir /s /q foo\*
выдает ошибку из-за неправильного синтаксиса.
админ:
takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder
Работает для чего угодно, включая sys файлы
EDIT: я нашел лучший способ, который также решает проблему с файлом слишком долго:
mkdir \empty
robocopy /mir \empty folder
robocopy /mir c:\empty .
takeown
помог мне , как я скопировал папку из системы Linux с Rsync по ошибке , и я не имел никаких привилегий , чтобы удалить эту папку ... Даже не Robocopy работал. Спасибо
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S
Удаляет все каталоги и файлы в указанном каталоге в дополнение к самому каталогу. Используется для удаления дерева каталогов.
/Q
Тихий режим, не спрашивайте, нормально ли удалять дерево каталогов с помощью /S
Вы можете установить cygwin, который имеет rm
, а также ls
и т.д.
Перейдите к пути и вызовите эту команду.
rd /s /q "FOLDER_NAME"
/s: Удаляет указанный каталог и все подкаталоги, включая любые файлы. Используйте /s для удаления дерева.
/q: Запуск rmdir в тихом режиме. Удаляет каталоги без подтверждения.
/?: Отображает справку в командной строке.
Для удаления каталога (независимо от того, существует он), используйте следующее:
if exist myfolder ( rmdir /s/q myfolder )
rmdir /S /Q %DIRNAME%
Сначала рассмотрим, что делает 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
, выдает ошибку, если цель не существует.
Следующий фрагмент script предполагает, что 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 foldername
Вот что вам нужно сделать...
Создайте пакетный файл со следующей строкой
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
Вы можете установить GnuWin32 и использовать * nix-команды изначально на окнах. Я устанавливаю это, прежде чем устанавливать что-либо еще на новую версию Windows.:)
rmdir/s dirname
через Powershell
Remove-Item -Recurse -Force "TestDirectory"
через командную строку
https://stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows
Использование Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Замените журналы на имя каталога, который вы хотите удалить.
get-childitem выполняет поиск дочернего каталога с именем рекурсивно по текущему пути (.).
remove-item удаляет результат.
вот что сработало для меня:
Попробуйте уменьшить длину пути. i.e:: Переименуйте все папки, которые приводят к такому файлу, к наименьшим возможным именам. Скажите одно письмо. Продолжайте переименование вверх в иерархии папок. Благодаря этому u эффективно уменьшает длину пути. Теперь попробуйте сразу удалить файл.
del/s/q directorytobedeleted
Существует также deltree, если вы используете более старую версию Windows.
Мне очень нравится этот сайт для поиска команд: SS64: Del - Удалить файлы