Что случилось с дедтрисом и какова его замена?

В более ранних версиях MS-DOS - я хочу сказать, что версия 7, но я мог ошибаться - была команда deltree, которая рекурсивно удаляла все подкаталоги и файлы с заданного пути.

deltree больше не существует, но del, похоже, не наследует возможности удаления дерева. del /s удаляет файлы, но не папки.

Как вам легко (т.е. в одной команде) удалить дерево из пакетного файла?

Ответ 1

Как уже упоминалось, команда rd имеет переключатель /s для рекурсивного удаления подкаталогов. Вы можете объединить его с переключателем /q для принудительного удаления подкаталога (и его содержимого) без запроса как такового

rd /s /q c:\foobar

Что не хватает, так это то, что rd не является точной заменой deltree как казалось бы (почти), каждая страница, возвращаемая Googling для windows deltree, будет ты веришь. Команда deltree работала как для каталогов , так и для файлов, что сделало ее единой удобной, универсальной командой удаления. Это справедливо:

deltree /y c:\foobar
deltree /y c:\baz.txt

Однако rd (не удивительно) работает только для каталогов. Таким образом, только первая из этих команд действительна, а вторая дает ошибку и оставляет файл не удаленным:

rd /s /q c:\foobar
rd /s /q c:\baz.txt

Кроме того, команда del работает только для файлов, а не для каталогов, поэтому только вторая команда действительна, а первая дает ошибку:

del /f /q c:\foobar
del /f /q c:\baz.txt

Нет встроенного способа удаления файлов и каталогов, как это можно сделать с помощью deltree. Использование rd и del индивидуально в лучшем случае неудобно, потому что требуется различать, является ли объект файловой системы (имя файла/папки) файлом или каталогом, который не всегда возможен или практичен.

Вы можете скопировать команду deltree из предыдущей ОС, однако она будет работать только в 32-разрядных версиях Windows, поскольку это 16-разрядная команда DOS (даже в Windows 9x).

Другой вариант - создать пакетный файл, который вызывает как del, так и rd; что-то вроде этого:

::deltree.bat

@echo off
rd  %* 2> nul
del %* 2> nul

Вы бы назвали это так:

deltree.bat /s /q /f c:\foobar
deltree.bat /s /q /f c:\baz.txt

Это вызывает как rd, так и del, передавая аргументы и перенаправляя вывод на nul, чтобы избежать ошибки, из которой один из них будет неизменно излучать.

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

Альтернативой является получение стороннего инструмента, хотя найти его - это реальное упражнение в поисковой обработке.

Ответ 3

Чувствуя ностальгию, я написал свой собственный deltree.exe. Он работает как с каталогами, так и с файлами и использует SHFileOperation() для скорости.

https://github.com/ai7/toolbox/tree/master/deltree

deltree v1.01 [Mar 27 2015, 16:31:02] (gcc 4.9.1)

Usage: deltree [options] <path> ...

Options:
  -y    yes, suppresses prompting for confirmation
  -s    silent, do not display any progress dialog
  -n    do nothing, simulate the operation
  -f    force, no prompting/silent (for rm compatibility)
  -r    ignored (for rm compatibility)

Delete directories and all the subdirectories and files in it.

Он принимает подстановочные знаки, и вы можете использовать его как unix rm:

deltree -rf *

Ответ 4

rmdir /s /q directory

Ответ 5

$ help rd
Removes (deletes) a directory.

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

Ответ 6

На самом деле команды RMDIR и RD в современной операционной системе Windows объединяют обе команды RD и Deltree of Win 98 в одной команде. Это внутренняя команда, почему вы не найдете RD.exe и RMDIR.exe.

Набрав этот "RD/?", в cmd без двойных qoutes вы получите именно то, что хотите.

Ответ 7

В настоящее время вы можете использовать Powershell для выполнения той же задачи:

powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"

Ответ 8

удалить каталог и все его содержимое рекурсивно

rd /s MY_DOOMED_DIR