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

Другий рядок проходить через всі підкаталоги (які тепер повинні бути порожніми) та видаляє їх.

Якщо не видалити всю папку та відтворити її (що, на мою думку, ви не хочете робити через дозволи?), Це повинен бути найпростішим способом очищення папки.


Якщо я пророблю тут невелику корекцію "for / f %% f" -> "for / f% f", тоді це працює добре :) Дякую вам дуже.
Майкл К

6
delне потрібно. rd/s/qвидалить і файли, і підпапки.
grawity

1
@grawity the delє, головним чином, для будь-яких файлів у кореневій папці, але може видалити рекурсійний перемикач.
Windos

5
@MichaelK, %% f призначений для використання в пакетних файлах,% f для, коли це одна команда прямо до командного рядка.
Windos

1
Якщо який - або з підкаталогів імен містять прогалини, ви можете додати «delims =" правильно обробити їх (для / F «delims =" %% F в ...): см 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

EDIT: звичайно, це рішення застосовується лише тоді, коли ви можете терпіти миттєву відсутність папки.


Це видалить початкову папку.
Майкл К

@MichaelK Моє завдання могла терпіти миттєву відсутність папки, тому я пішов із цим рішенням. Я думав, що це простіше і читабельніше, ніж for /fу подібних до моїх випадках. Просто хотів поділитися
Василь.Прокоп’єв

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

Це не працює, якщо підкаталоги містять інші каталоги, які містять пробіли.

Для того, щоб зробити цю роботу, мені потрібно було процитувати заключний рядок, як це

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

Мабуть, це змушує команду працювати над цитуваним рядком замість просто самого рядка.


0

Я б спробував це в папці, де всі папки повинні бути видалені, але корінь (і файли в корені) залишилися такими, як вони є: для / D% v in (*) do rd / s / q% v

для / D відповідає каталогам, а rd / s / q видаляє кожен за один раз


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.