Пакетный файл. Удалить все файлы и папки в каталоге

135

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

В настоящее время у меня есть следующее:

cd "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS"
del *.db

Это удалит все файлы .db в моем каталоге RMS , однако я хочу удалить все из этого каталога. Как я могу это сделать?

user69514
источник
3
Введите del /?в командной строке. Это даст вам информацию о том, как использовать инструмент. В этом случае del *.* /sбудет работать, но не делайте это в неправильном каталоге!
Майкл Тодд
35
rmdir /s /q c:\users\tbrollo\j2mewtk\2.5.2\appdb\RMS
Форсварир
Я бы предложил за правильные голоса изменить правильный ответ
GregM
5
Ответ forsvarir также удаляет RMSкаталог, который может не соответствовать тому, что предполагалось. (На самом деле это часто то, чего я не хочу, потому что тогда я теряю первоначальную временную метку каталога и все имеющиеся у него разрешения.) См. Мой ответ, чтобы узнать, как удалить все содержимое каталога, но оставить сам каталог в место.
Bill_Stewart

Ответы:

51

del *.*вместо del *.db. Это удалит все.

Джон Мартин
источник
56
Примечание. Если вы хотите обойти запрос «Вы уверены, что хотите удалить ...», вам необходимо добавить / FQ флаги:del . /F /Q
Rhyuk
41
это только удаляет файлы - не папки
icc97
52
Это не должно быть помечено как правильный ответ, потому что это не удаляет папки (как указано в вопросе).
Bill_Stewart
158

Использование:

  • Создать пакетный файл

  • Скопируйте приведенный ниже текст в командный файл

    set folder="C:\test"
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
    

Это удалит все файлы и папки.

GregM
источник
4
Круто, я искал что-то, чтобы очистить файлы и папки для ежемесячной пакетной работы, и это помогло.
Дейв Хардинг
9
Убедитесь, что каталог существует, прежде чем сделать это.
Bill_Stewart
2
Если у вас есть «специальные» символы в именах файлов, сначала chcp 10000измените кодировку на UTF-16
Demelziraptor
3
Просто хочу добавить заметку к комментарию от Bill_Stewart. Причина, по которой вы хотите убедиться, что каталог существует, заключается в том, что в противном случае он очистит каталог, в котором вы находитесь. В моем случае это был пакетный файл, над которым я работал более 30 минут. :( Хорошо, что остальная часть папки была под контролем исходного кода.
helios456
2
@vee изменить цикл на (rmdir "%%i" /s/q 2>NUL || del "%%i" /s/q >NUL ) подавление сообщений об ошибках и удалении
Карл Уолш
34
IF EXIST "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS" (
    rmdir "C:\Users\tbrollo\j2mewtk\2.5.2\appdb\RMS" /s /q
)

Это удалит все из папки (и самой папки).

infojolt
источник
13
Я думаю, что вопрос в том, чтобы очистить каталог от всего содержимого, но не удалять сам каталог.
Bill_Stewart
16

del *.*удаляет только файлы, но не подкаталоги. Чтобы очистить содержимое каталога, вы можете использовать этот скрипт:

@echo off
setlocal enableextensions
if {%1}=={} goto :HELP
if {%1}=={/?} goto :HELP
goto :START

:HELP
echo Usage: %~n0 directory-name
echo.
echo Empties the contents of the specified directory,
echo WITHOUT CONFIRMATION. USE EXTREME CAUTION!
goto :DONE

:START
pushd %1 || goto :DONE
rd /q /s . 2> NUL
popd

:DONE
endlocal

В pushdизменениях в каталог которого вы хотите удалить ребенок. Затем, когда rdпросит удалить текущий каталог и все вложенные каталоги, удаление вложенных каталогов завершается успешно, но удаление текущего каталога завершается неудачно - потому что мы в нем. Это приводит к ошибке, которая 2> NULглотает. (2 - поток ошибок).

Bill_Stewart
источник
6
Я немного подумал, как именно это работает, и объяснил другим: pushd переходит в каталог, из которого вы хотите удалить дочерние элементы. Затем, когда rd просит удалить текущий каталог и все подкаталоги, удаление подкаталогов происходит успешно, но удаление текущего каталога завершается неудачно - потому что мы в нем. Это приводит к ошибке, которая глотает 2> NUL. (2 - поток ошибок). Очень хитрый мистер Стюарт!
Кинетический
Да, и «setlocal enableextensions» включает возможность одновременно помещать текущий каталог в стек и изменять каталог. Это только кажется обязательным до XP, так как там и позже он по умолчанию включен в любом случае.
Кинетический
Можете ли вы интегрировать информацию из комментариев в ответ (комментарии могут исчезнуть в любой момент)? ( Без использования «Правка:» «Обновление:» метки .)
Питер Мортенсен
12

Я просто собрал это воедино из того, что написал morty346:

set folder="C:\test"
IF EXIST "%folder%" (
    cd /d %folder%
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
)

Он добавляет быструю проверку того, что папка, определенная в переменной, существует первой, меняет каталог на папку и удаляет содержимое.

Fantus_Longhorn
источник
2
Итак, быстрый совет - если вы попытаетесь запустить его по сетевому пути, даже с помощью оператора «IF EXIST», он не сможет установить папку, и оператор будет записан в командной строке cmd. «UNC-пути не поддерживаются, по умолчанию Каталог Windows ", то он будет пытаться удалить все в вашем каталоге Windows. Так что будьте осторожны.
CBRF23
11

Вы можете сделать это, используя delи /Sфлаг (чтобы указать, что нужно извлекать все файлы из всех подкаталогов):

del /S C:\Path\to\directory\*

Команда RD также может быть использована. Рекурсивно тихо удалить без запроса:

@RD /S /Q %VAR_PATH%

Rmdir (rd)

PodTech.io
источник
5
set "DIR_TO_DELETE=your_path_to_the_folder"

IF EXIST %DIR_TO_DELETE% (
    FOR /D %%p IN ("%DIR_TO_DELETE%\*.*") DO rmdir "%%p" /S /Q
    del %DIR_TO_DELETE%\*.* /F /Q
)
Кристиан Тетик
источник
3

Попробуйте следующее; меня устраивает.

У меня есть приложение, которое сбрасывает данные в мою папку «C: \ tmp», и следующее работает лучше всего для меня. Он даже не спрашивает Да или Нет, чтобы удалить данные. Я составил график запуска через каждые 5 минут

cd "C:\tmp"

del *.* /Q
poorvesh
источник
7
Если папка «C: \ tmp» отсутствует (если вы или какое-либо другое приложение удалили эту папку) и если вы попытаетесь запустить эту папку, не удалит ли она данные из другой папки внутри «C: \»? (Это случилось со мной)
Викрам
4
Как отмечает Викрам: 1) это очень опасно, и 2) он не удаляет подкаталоги, как указано в вопросе.
Bill_Stewart
2
В дополнение к папкам ... можно просто сделать del /q c:\tmp\*.*, что примерно в миллион раз безопаснее. Не говоря cdуже о том, что изменится только путь, а не диск.
Nyerguds
1
Это ужасный совет. Как уже упоминали другие, в результате вы можете очистить так много важных данных. Помечено для удаления, я думаю, что это плохо.
RyanfaeScotland
2

А еще лучше, скажем, я хочу удалить все в C:\windows\tempпапке.

@echo off
rd C:\windows\temp /s /q
user3788752
источник
11
Это удаляет каталог c:\windows\temp. Я не думаю, что это было то, что задал оригинальный вопрос.
Bill_Stewart
Удаление каталога кажется мне самым легким, и если мне понадобится заново его создать, я смогу. Одной из проблем может быть потеря специальных разрешений для папок. Однако это кажется намного проще, чем большинство других ответов.
Мадан
1
К сожалению, удаление и немедленное воссоздание из пакетного скрипта, кажется, дают случайные ошибки «отказано в доступе» на Win10 ...
Nyerguds
2

Вы можете использовать robocopy для зеркалирования пустой папки в папку, которую вы очищаете.

robocopy "C:\temp\empty" "C:\temp\target" /E /MIR

Это также работает, если вы не можете удалить или воссоздать фактическую папку.

Требуется существующий пустой каталог.

Аарон
источник
1
Согласно помощи Robocopy, /MIR :: MIRror a directory tree (equivalent to /E plus /PURGE).- так что я вполне уверен, что /Eэто избыточно.
Nyerguds
2

использование

set dir="Your Folder Path Here"
rmdir /s %dir%
mkdir %dir%

Эта версия удаляется без запроса:

set dir="Your Folder Here"
rmdir /s /q %dir%
mkdir %dir%

Пример:

set dir="C:\foo1\foo\foo\foo3"
rmdir /s /q %dir%
mkdir %dir%

Это будет ясно C:\foo1\foo\foo\foo3.

(Я хотел бы упомянуть ответ Абдуллы Сабуина . Я перепутал его с копией . Я не заметил его пост. Я хотел бы поблагодарить вас, Мельпомена, за указание на ошибки!)

TravieDude Minecraft и многое другое
источник
Это не работает вообще. rmdir fooошибки, если fooне пустой каталог.
Мельпомена
@ melpomene Я нашел ошибку, и она должна быть исправлена ​​!!
TravieDude Minecraft и другие
1
Я не хотел копировать @Abdullah Sabouni в любом случае. Я, должно быть, не заметил этого. Мне жаль.
TravieDude Minecraft и другие пользователи
@ melpomene Я изложил свою ошибку и свою точку зрения на то, что произошло. Но я решил не удалять, если это все равно поможет. Спасибо что подметил это.
TravieDude Minecraft и многое другое
@TravieDudeMinecraftandMore +1 - работал и для меня.
Гай Авраам
0

Вы не можете удалить все с одним rmdirили delодним:

  • rmdir /s /qне принимает групповые параметры. Так rmdir /s /q *будет ошибка.
  • del /s /f /q удалит все файлы, но пустые подкаталоги останутся.

Мое предпочтительное решение (как я использовал во многих других пакетных файлах):

rmdir /s /q . 2>NUL
butfly
источник
0

Просто измененная версия ответа ГрегМ :

set folder="C:\test"
cd /D %folder%
if NOT %errorlevel% == 0 (exit /b 1)
echo Entire content of %cd% will be deleted. Press Ctrl-C to abort
pause

REM First the directories /ad option of dir
for /F "delims=" %%i in ('dir /b /ad') do (echo rmdir "%%i" /s/q)

REM Now the files /a-d option of dir
for /F "delims=" %%i in ('dir /b /a-d') do (echo del "%%i" /q)

REM To deactivate simulation mode remove the word 'echo' before 'rmdir' and 'del'.
grenix
источник
-1
@echo off
@color 0A

echo Deleting logs

rmdir /S/Q c:\log\

ping 1.1.1.1 -n 5 -w 1000 > nul

echo Adding log folder back

md c:\log\

Вы были на правильном пути. Просто добавьте код, чтобы добавить папку, которая будет удалена снова.

Абдулла Сабуни
источник
1
Я не рекомендую это решение, потому что оно удаляет каталог (таким образом теряет свои разрешения) и воссоздает его (возможно, с другими разрешениями).
Bill_Stewart
-3

Вы должны выполнить эту команду, чтобы удалить все файлы:

del*.*
Дэвид Наранхо Эрнандес
источник
6
такой же, как принятый ответ от 26 июля 11 в 21:04. Пожалуйста, не добавляйте ответ, если у вас нет ничего нового.
Стефан
2
В дополнение к действительной критике от @Stephan, команда должна быть del *.*(с пробелом)
Ty Hitzeman