Bat удалить файлы по маске

Обновлено: 07.07.2024

Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.

Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.

Содержание:

1. Скрипт удаления файлов старше n-дней

2. Создание задания в планировщике задач

Скрипт на самом деле очень простой, создается в PowerShell и выглядит он следующим образом:

Где:
F:\backup\ - путь, в какой папке мы будем с вами искать файлы для удаления *.* - имя (маска) файлов /d -30 - старше скольки дней нам необходимо удалить файлы.

Вот так это выглядит в PowerShell:

удаление


Осталось только его выполнить и все.


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

Итак, что нам для этого надо?

Для начала идем в "Пуск -> панель управления -> Администрирование" и запускаем там "Планировщик заданий".


Выбираем пункт "Создать задачу":


На вкладке "Общие" задаем имя задания, его описание и пользователя, от которого оно будет выполняться. По умолчанию там будет пользователь, под которым вы вошли в данный момент в систему.


Далее переходим на вкладку "Триггеры" и создаем расписание, когда мы будем запускать наше задания. У меня настроено в 10:00 каждые 2 дня.


Далее идем на вкладку "Действия" и задаем действие, которое будет выполняться. Выбираем "Запуск программы"

программу или сценарий

и указываем путь до PowerShell:

А аргументе указываем путь до нашего скрипта, который мы создали ранее:

Нажимаем "Ок" и еще раз "Ок"

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

Скажем, есть переменная с именем %pathtofolder% , которая проясняет, что это полный путь к папке.

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

Но может быть ошибка типа «этот файл / папка уже используется» . когда это происходит, нужно просто продолжить и пропустить этот файл / папку.

Есть ли какая-то команда для этого?

Это безумие, как трудно Windows удалить папки . Или создать папку, начинающуюся с точки . Слава богу за интеграцию Bash в Windows! rm -rf path\to\folder работает в Windows 10 (или может прийти из Git Bash . в любом случае, если у вас есть, что стоит попробовать!)

Вы можете использовать этот скрипт для очистки папки и файлов в C:\Temp исходном коде :

Создайте пакетный файл (скажем, delete.bat), содержащий указанную выше команду. Перейдите в папку, в которой находится файл delete.bat, а затем выполните команду: delete.bat

Я пробовал, но, к сожалению, файлы, которые не были удалены, удаляются только подпапки. Например, у меня есть папка с именем Test. Он содержит 2 папки с именами «Ripon» и «Wasim» и содержит файл с именем «riponalwasim.txt». Подпапки Ripon и Wasim были удалены, но riponalwasim.txt не был удален. Используйте одиночный знак процента, если вы хотите работать напрямую из командной строки, например %p Грустно, что это занимает 2 строки, но, по крайней мере, это работает! Я устал искать работающий «однострочник» и пойду с этим, спасибо! Вы можете использовать оператор «&&» для выполнения двух команд в одной строке без файла bat (обратите внимание на один «%» вместо «%%»). del / s / q "myfolder *" && FOR / D% p IN ("myfolder *") DO rmdir "% p" / s / q <for / F "delims =" %% i in ('dir / b / a-d') do (echo del "%% i" / q)> может помочь для файлов (просто удалите это эхо)

rmdir моя самая любимая команда для работы. Он работает для удаления огромных файлов и папок с подпапками. Резервная копия не создается, поэтому перед выполнением этой команды убедитесь, что вы скопировали свои файлы безопасно.

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

Похоже, это удаляет путь к каталогу, который ОП хотел сохранить. Это приведет к удалению самой папки, поэтому вам нужно добавить еще одну команду: md FOLDERNAME (см. Ответ от @rakoczyn ниже). Что вы подразумеваете под «резервное копирование создано» здесь? Я не вижу ничего, что могло бы создать какую-либо резервную копию . Чтобы не удалять саму папку, сделайте ее текущей папкой, а затем используйте «.» как FOLDERNAME. Повторное создание этого впоследствии не обязательно то же самое, потому что ACL могли быть потеряны. cd "FOLDERNAME" RD . /S /Q

Самое простое решение, которое я могу придумать, - это удалить весь каталог с помощью

Затем создайте этот каталог снова:

Что делать, если у вас есть разрешение на удаление, но не создание новых папок? Я надеюсь, что это возможно :) Это плохое решение, так как оно приводит к гонке в файловой системе за узел каталога, то есть вторая команда может потерпеть неудачу, если выполняется сразу после нее. Кроме того , плохое решение , если каталог имеет специальные разрешения , которые вы просто Nuked гм (упс) Не откладывайте на ответ: «Каталог не пустой». Просто дважды введите команду :-) RD и RMDIR - это одна и та же команда, и, поскольку вы опубликовали этот ответ через 9 месяцев после того, как кто-то дал тот же ответ, почему люди дают вам очки?

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

Для тех, кто не уверен в этом подходе: он определенно не создает каталог заново. Без 2>nul него выводится «Процесс не может получить доступ к файлу, потому что он используется другим процессом». Я ненавижу, что Windows не может удалить файлы и папки, используемые какой-либо программой. И мне нравится, что вы использовали это в свою пользу в этой строчке. Так что это убер-магия, как мы очищаем папку в Windows ?? Впечатляет :) @mlvljr Только если вы хотите сохранить родительскую папку тоже. RD /? покажет вам простой способ очистить папку. Это хорошо, если вам нужно вернуться на исходную позицию, иначе просто CD mypath && RD /S . будет достаточно. Мне не нравится, что вам приходится повторять свой путь дважды, хотя для длинных путей его становится трудно читать. Так что я бы просто добавил set p="mypath" в начале.

. удаляет все файлы и папки в данном каталоге, но не сам каталог.

это должен быть правильный ответ .. просто сделайте простой .. deletemyfoldercontents.bat файл .. вставьте ваш путь, и он работает как шарм .. В командной строке DEL также отсутствует опция /A для удаления файлов со скрытым набором атрибутов, и %dir%\* их следует заключать в двойные кавычки, как, например, "%dir%\*" для каталогов, содержащих пробел или один из этих символов &()[]<>^=;!'+,`

. И командную строку FOR следует изменить на, for /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I" поскольку FOR игнорирует каталоги со скрытым набором атрибутов. DIR с параметрами /AD /B выводит все каталоги только с их именами. Кстати, dir это не хорошее название для переменной среды.

@RMiranda, в моих тестах, он делает именно так, как просил ОП. У вас есть случай, когда он не удаляет подпапки? Отвечает ли этот ответ требованию «может быть ошибка типа« этот файл / папка уже используется ». когда это происходит, он должен просто продолжить и пропустить этот файл / папку». ?

Обновление :

Из этого полезного комментария (спасибо Moritz Both ) вы можете добавить && между ними, поэтому RMDIR не запустите, если CD команда не будет выполнена (например, имя каталога с ошибкой):

/ S: удаляет дерево каталогов (указанный каталог и все его подкаталоги, включая все файлы).

/ Q: Указывает тихий режим. Не запрашивает подтверждения при удалении дерева каталогов. (Обратите внимание, что / q работает, только если указан / s.)

Это идеально подходит для очистки temp, но это cd [Your_Folder] очень важно - я должен помнить об этом, чтобы не удалять сам каталог . Это правильное решение. Добавьте && между командами вместо разрыва строки, и вы в безопасности от сбой CD. Это простое и правильное решение. Даже работает с командной оболочкой Azure! довольно плохое решение . Мне, например, нужно это удаление командной строки для обновления SVN - я хочу удалить все файлы и папки, прежде чем я сделаю обновление SVN, потому что могут быть некоторые изменения на машине, где я использую это, но актуально только проверенные в пунктах. Делать RMDIR / S / Q. также удаляет ссылку SVN и, следовательно, больше не делает папку svn

RD расшифровывается как REMOVE Directory.

/ S: Удалить все файлы и подпапки в дополнение к самой папке. Используйте это, чтобы удалить все дерево папок.

/ Q: Тихо - не отображать подтверждение YN

проголосовал за то, что был единственным, кто объяснил, что /S и что /Q значит Номер rd эквивалентен rmdir и удалит сам каталог, а не тот, который хочет OP. Отвечает ли этот ответ требованию «может быть ошибка типа« этот файл / папка уже используется ». когда это происходит, он должен просто продолжить и пропустить этот файл / папку.»? Например, прерывается ли он полностью вместо продолжения?

Я использую Powershell

Он удалит содержимое папки, а не саму папку.

Ответ rhellem недавно, но это единственный ответ, который действительно сделает это для меня. (Win 8.1, не по выбору) Из командной строки пакета: powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force" Обратите внимание, что "*" необходимо, или оно удалит папку.

Простое решение для единой командной строки, которое, конечно же, также можно использовать в командном файле:

Эта командная строка содержит три команды, выполняемые одна за другой.

Первая команда PUSHD помещает текущий путь к каталогу в стек, а затем создает %PathToFolder% текущий каталог для запуска процесса команды.

Это также работает для путей UNC по умолчанию, поскольку расширения команд включены по умолчанию, и в этом случае PUSHD создает временную букву диска, которая указывает на указанный сетевой ресурс, а затем изменяет текущий диск и каталог, используя вновь определенную букву диска.

Система не может найти указанный путь.

Следующая команда RD выполняется только в том случае, если изменение текущего каталога для текущего командного процесса на указанный каталог прошло успешно, то есть указанный каталог вообще существует.

Команда RD с параметрами /Q и тихо /S удаляет каталог со всеми подкаталогами, даже если указанный каталог содержит файлы или папки со скрытым атрибутом или с установленным атрибутом только для чтения. Системный атрибут никогда не препятствует удалению файла или папки.

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

Файлы, открытые в настоящее время любым запущенным процессом с правами доступа к файлу, установленными для открытия файла, чтобы предотвратить удаление файла во время открытия работающим приложением / процессом. Такой открытый файл также предотвращает удаление всего дерева папок в открытый файл.

Файлы / папки, для которых у текущего пользователя нет необходимых (NTFS) разрешений на удаление файла / папки, что также предотвращает удаление дерева папок в этот файл / папку.

Процесс не может получить доступ к файлу, потому что он используется другим процессом.

Третья команда, POPD , выполняется независимо от значения выхода команды RD .

POPD извлекает путь каталога, выдвинутый PUSHD из стека, и изменяет текущий каталог для запуска процесса команды на этот каталог, то есть восстанавливает исходный текущий каталог. POPD удаляет временную букву диска, созданную PUSHD в случае пути к папке UNC.

Примечание: POPD может молча прекратить восстановление первоначального текущего каталога в случае, если исходный текущий каталог был подкаталогом каталога для очистки, который больше не существует. В этом особом случае %PathToFolder% остается текущий каталог. Поэтому желательно запускать командную строку выше, а не из подкаталога %PathToFolder% .

Еще один интересный факт: я пробовал в командной строке также использовать UNC-путь, используя общий каталог C:\Temp с именем общего ресурса Temp и используя UNC-путь, \\%COMPUTERNAME%\Temp\CleanTest назначенный переменной среды PathToFolder в Windows 7. Если текущий каталог при запуске командной строки является подкаталогом общего локального каталога папка доступ с помощью UNC - пути, то есть C:\Temp\CleanTest\Subfolder1 , Subfolder1 удаляются с помощью РДА , а следующий POPD терпит неудачу молча делаю C:\Temp\CleanTest\Subfolder1 снова текущий каталог в результате Z:\CleanTest оставшегося в качестве текущего каталога для процесса команды работает. Таким образом, в этом очень особом случае временная буква диска остается до тех пор, пока текущий каталог не будет изменен, например, с помощью cd /D %SystemRoot% в локальный каталог действительно существует. К сожалению, POPD не завершается со значением больше 0, если не удается восстановить исходный текущий каталог, что делает невозможным обнаружение этого особого состояния ошибки, используя только код выхода POPD . Однако можно предположить, что никто никогда не сталкивался с этим особенным случаем ошибки, поскольку пути UNC обычно не используются для доступа к локальным файлам и папкам.

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

Теперь давайте посмотрим на решение для пакетных файлов, используя команду DEL для удаления файлов в %PathToFolder% и FOR и RD для удаления вложенных папок в %PathToFolder% .

Пакетный файл сначала гарантирует, что переменная среды PathToFolder действительно определена с путем к папке без двойных кавычек и без обратной косой черты в конце. Обратная косая черта в конце не будет проблемой, но двойные кавычки в пути к папке могут быть проблематичными, поскольку PathToFolder во время выполнения пакетного файла значение объединяется с другими строками.

Важны две строки:

Команда DEL используется для удаления всех файлов в указанном каталоге.

Команды FOR и RD используются для удаления всех подкаталогов в указанном каталоге. Но for /D не используется, поскольку FOR игнорирует в этом случае подкаталоги с установленным атрибутом hidden. По этой причине for /F используется для запуска следующей командной строки в отдельном командном процессе, запущенном в фоновом режиме с помощью %ComSpec% /c :

Оператор перенаправления > должен быть экранирован с помощью символа вставки, ^ в командной строке FOR интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную dir командную строку в отдельном запущенном командном процессе. на заднем фоне.

FOR обрабатывает захваченный вывод, записанный для обработки STDOUT запущенного командного процесса, которые являются именами подкаталогов без пути и никогда не заключаются в двойные кавычки.

Параметр FOR with /F игнорирует пустые строки, которые здесь не встречаются, поскольку DIR с параметром /B не выводит пустые строки.

FOR также игнорирует строки, начинающиеся с точки с запятой, которая является символом конца строки по умолчанию. Имя каталога может начинаться с точки с запятой. По этой причине eol=| используется для определения символа вертикальной черты как символа конца строки, который ни один каталог или файл не может иметь в своем имени.

FOR разделит строку на подстроки, используя пробел и горизонтальную табуляцию в качестве разделителей, и назначит только первую строку с пробелом / табуляцией для указанной переменной цикла I . Такое поведение разделения здесь нежелательно, поскольку имя каталога может содержать один или несколько пробелов. Поэтому delims= используется для определения пустого списка разделителей, чтобы отключить поведение разделения строк и получить присвоение переменной цикла I , всегда полное имя каталога.

Команда FOR запускает команду RD для каждого имени каталога без пути, поэтому в командной строке RD необходимо еще раз указать путь к папке, который объединяется с именем подпапки.

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

P < путь > Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)

/M < маска_поиска > Поиск файлов с помощью маски. Маска поиска по умолчанию "*"

/S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S"

/C < команда >
Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды:

@file Возвращает имя файла
@fname Возвращает имя файла без расширения
@ext Возвращает только расширение имени файла
@path Возвращает полный путь к файлу
@relpath Возвращает относительный путь к файлу
@isdir Возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов
@fsize Возвращает размер файла в байтах
@fdate Возвращает дату последнего изменения файла
@ftime Возвращает время последнего изменения файла

Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для табуляции, 0x22 - двойная кавычка). Перед внутренними командами CMD.exe необходимо ставить "cmd /c".

/D < дата > Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан.

/? или -? Вывод справки по использованию

Замечания по использованию FORFILES

На что хотелось бы сразу обратить внимание.
Параметр P - это именно путь к обрабатываемым файлам. И нельзя здесь писать по привычке заодно и маску файлов, например /p с:\tmp\*.tmp. Это неправильно! Для маски файлов существует отдельный параметр - M.
И это еще можно было бы понять, если бы в параметре M можно было бы перечислить несколько масок. Так нет же.
И раз уж речь зашла о масках - переменная @ext содержит расширение выбранного файла и может быть использована для обработки.

Примеры использования FORFILES

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

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

FORFILES /p C:\111 /s /c "CMD /C if @ISDIR==TRUE echo @FILE is a folder"

Учитывая некоторую . нестандартность параметров команды FORFILES, на мой взгляд, в простых случаях лучше использовать команду dir. По крайней мере, привычнее.

Наиболее часто используемый случай для команды FORFILES- удаление ( реже - копирование, перемещение ) файлов старше определенной даты.

Так же просто решается задача обработки файлов, старше определенного количества дней.

В приведенном выше примере все файлы текущей папки дата создания (изменения) которых больше 30 дней переносятся в архив.

Как вариант - обработка файлов с текущей датой создания (изменения).

Следующая популярная область применения FORFILES - обработка файлов в зависимости от их размера.

FORFILES /P c:\ /S /C "cmd /c if @fsize GTR 10000000 echo @path"
Не бесполезный пример. Позволяет провести аудит диска на предмет наличия "больших" файлов.
И еще один пример - поиск "маленьких" файлов, как вариант - нулевой длины. FORFILES /P "%USERPROFILE%\Local Settings\Temporary Internet Files\Content.IE5" /S /C "cmd /c if @isdir==FALSE if @fsize == 0 del @path /q"

В приведенном выше примере использования FORFILES из папок временных файлов Internet Explorer удаляются файлы нулевой длины.
Если вы пользуетесь этим браузером и редко чистите кэш, то таких ненужных файлов там немало.
На основе предыдущих примеров использования FORFILES без труда можно написать пример очистки и от "старых" файлов, но корректнее это делать соответствующей оснасткой.

В качестве исполняемой команды допустимо использовать внешний bat файл, которому FORFILES может передавать параметры.
Так, в следующем примере для файлов с текущей датой создания (изменения) вызывается bat файл 1.bat, которому в качестве параметра передается имя файла. Т. е. 1.bat будет вызван столько раз, сколько найдется файлов, удовлетворяющих условию.

Несмотря на то, что такое использование может значительно расширять возможности FORFILES, использовать такой прием следует с осторожностью, так как это может значительно увеличить время обработки.

Несколько экзотический пример использование FORFILES. Просто показать возможности этой команды.

FORFILES /M *.txt /C "cmd /c if @fname==0x22qq0x22 echo 0x07"

Мы рассмотрели примеры использования FORFILES.
На мой взгляд, несмотря на некоторую необычность параметров, эта команда стоит того, что бы уделить ей внимание.

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь

Первым делом откроем Блокнот через "Пуск" - "Все программы" - "Стандартные" - "Блокнот", либо через программу "Выполнить", нажав на клавиатуре сочетание клавиш "Win" + "R" и набрав команду "notepad".


Теперь создадим BAT-файл. В открывшемся Блокноте щелкаем по кнопке "Файл" - "Сохранить как. ", далее выбираем местоположение на вашем ПК, например, я выбрал рабочий стол, далее пишем имя будущей программы и указываем расширение "cleaner.bat" (имя можно придумать любое, но расширение .bat менять не нужно!).


В ново созданном файле будем писать команды для очистки системы.

Очистка временных файлов

Первым делом очистим все временные папки на вашем ПК, для этого будем использовать команду "DEL" с параметрами "/q /f /s" - файлы, подпапки, папки.

Набираем в Блокноте (bat-файле) следующее:



где, "%WINDIR%\Temp" — равносильно, что и "C:\Windows\Temp", а "%SYSTEMDRIVE%" — системный раздел, в большинстве случаев это — "C:\", "%Temp%" и "%Tmp%" — папки с временными файлами пользователей.

Очистка папки Prefetch

В папке Prefetch (файлы с расширением .pf) находится информация о часто открываемых программах и сервисах, для более быстрой их последующей загрузки. Из этой папки можно удалить все файлы, что позволит системе быстрее грузится, но при этом в первый раз программы будут загружаться медленнее. После удаления всех файлов и папки система снова создаст кэш этих часто запускаемых программ. Зачем нужно чистить эту папку? Часто в этой папке Prefetch содержится кэш давно удаленных программ, поэтому размер папки может достигнуть по умолчанию до 400 Мб.

Команда на очистку папки Prefetch:


Очистка бортового журнала - логи, баки, гиды и прочее

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

Команда для очистки этих файлов:



Команда удалит все файлы по маске (*.log, *.bak, *.gid) на системном диске, включая подкаталоги системного диска.

Что у нас получилось?

Полученный результат сохраняем: "Файл" - "Сохранить". Теперь можем запускать bat-файл для очистки системы от мусора.


спасибо этому сайду за хорошею информацию о борьбе от мусора в ПК и разработчику этой инфо


Огромное спасибо, я решил сделать чистилщик, а потом решил сделать меню! Получилось круто


Спасибо, пригодилось!


Аноним, Автор говно совсем, тупо списывает статьи Чувак, не знаю как у тебя, у меня поисковик этот сайт выдал первым в поиске, может другие ресурсы списывают статьи отсюда?


Автор говно совсем, тупо списывает статьи


Добрый день. Помогите добавить В c:\Windows\SoftwareDistribution\ и в c:\Windows\Installer\ в этот батник


thx


На 6Gb базу таким образом развернул. Всё отлично, автору всего самого доброго и хорошего)


Аноним, Программа, действительно, говно. Видео, снятое айфоном, неизбежно сохраняет в худшем качестве, хоть на максимум все доступные бегунки выверни. При этом файл будет весить в десятки (. ) раз больше, а качество говно! Полностью согласен сохраняет в говно и размером в разы больше. Как так можно испохабить бочку меда ложкой дегтя


Аноним, Здравствуйте, подскажите почему камера не записывает данные при отсутствии сеети. Карта памяти установлена в камере?


Здравствуйте, подскажите почему камера не записывает данные при отсутствии сеети.


ты спамер, клоун


Аноним, Не помогло. Перепробовал всё. Один фиг запрашивает логин и пароль. Любые введи - сработает


спасибо в mi 12 в разделе безопасность


Какая стандартная тема?
Light и Dark


@Timka251
СУПЕР.

Читайте также: