Как удалить деревья каталогов через командный файл в Windows 7?

36

Я хочу удалить все содержимое указанной папки в Windows 7 через командный файл. Моя проблема в том, что «del» или «erase» удаляет только файлы, а не папки, а «rmdir» или «rd» всегда удаляет указанную папку с ее содержимым, но я хочу удалить только содержимое, а не саму папку , Я попробовал команду ' rmdir /S /Q "C:\Share\*"', которая дала мне синтаксическую ошибку.

Как правильно это сделать?

Я работаю на 64-битной Windows 7 Professional и имею права администратора.

Майкл К
источник

Ответы:

36

Ваш пакетный файл должен будет выполнить две команды: одну для очистки файлов, а другую для удаления дочерних каталогов. Я предположил, что каталог, который вы хотите удалитьC:\Share\

Пакетный файл должен выглядеть примерно так:

del /s /f /q c:\share\*.*
for /f %%f in ('dir /ad /b c:\share\') do rd /s /q c:\share\%%f

del /s /f /q будет рекурсивно искать по дереву каталогов, удаляя любые файлы (даже файлы только для чтения), не запрашивая подтверждения.

Вторая строка проходит по всем подкаталогам (которые теперь должны быть пустыми) и удаляет их.

Если не считать удаления всей папки и ее повторного создания (что я не думаю, что вы хотите сделать из-за разрешений?), Это должен быть самый простой способ очистки папки.

Windos
источник
Если я сделаю небольшую поправку здесь «для / f %% f» -> «для / f% f», то все будет хорошо :) Спасибо большое.
Майкл К
6
delне обязательно. rd/s/qудалит как файлы, так и подпапки.
Гравитация
1
@grawity в delосновном для любых файлов в корневой папке, хотя может удалить рекурсивный переключатель.
Windos
5
@MichaelK, %% f для использования в пакетных файлах,% f для случаев, когда это одна команда прямо в командной строке.
Windos
1
Если какой - либо из подкаталогов имен содержат пробелы, вы можете добавить «delims =» правильно обрабатывать их (для / е «delims =» %% е в ...): См stackoverflow.com/q/5553040/64918
goldPseudo
27
rmdir /s/q C:\Share

Вы получаете «синтаксическую ошибку», потому что rmdirпринимает только полные имена, а не подстановочные знаки. (В частности cmd.exe, расширение по шаблону оставлено для отдельных программ; не все из них делают.)

Если у вас много каталогов, начинающихся с Share..., используйте forцикл.

for /d %f in (C:\Share*) do rmdir /s/q "%f"
grawity
источник
3
Я не хочу удалять папку общего доступа.
Майкл К
12

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

rd /s/q "C:\Share"
Чау Чи Ян
источник
2
Это также удаляло родительскую папку, а не ее содержимое.
Теоман Шипахи
2

Как насчет ?

rmdir /S /Q "target"
mkdir "target

РЕДАКТИРОВАТЬ: конечно, это решение применимо только тогда, когда вы можете терпеть мгновенное отсутствие папки.

Vasilly.Prokopyev
источник
Это позволит удалить исходную папку.
Майкл К
@MichaelK Моя задача была в состоянии выдержать кратковременное отсутствие папки, поэтому я пошел с этим решением. Я подумал, что это проще и удобочитаемее, чем for /fв случаях, подобных моему. Просто хотел поделиться
Василий. Прокопьев
2
for /f "delims=" %%f in ('dir /ad /b c:\share\') do rd /s /q c:\share\%%f

Это не работает, если подкаталоги содержат другие каталоги, содержащие пробелы.

Чтобы сделать эту работу, мне нужно было процитировать последнюю строку, как это

for / f "delims =" %% f in ('dir / ad / bc: \ share \') do rd / s / q "c: \ share \ %% f"

По-видимому, это заставляет команду работать со строкой в ​​кавычках вместо самой строки.

Джим JR Харрис
источник
0

Я хотел бы попробовать это в папке, где все подпапки должны быть удалены, но корень (и файлы в корне) остались без изменений: для / D% v в (*) сделать rd / s / q% v

for / D соответствует каталогам, а rd / s / q удаляет каждый за раз

Отто Ханнинен
источник