Как удалить деревья каталогов через командный файл в 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 будет рекурсивно искать по дереву каталогов, удаляя любые файлы (даже файлы только для чтения), не запрашивая подтверждения.

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

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


Если я сделаю небольшую поправку здесь «для / 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"

3
Я не хочу удалять папку общего доступа.
Майкл К


2

Как насчет ?

rmdir /S /Q "target"
mkdir "target

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


Это позволит удалить исходную папку.
Майкл К

@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"

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


0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.