Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Удаление файла по дате в Имени

Ответить
Настройки темы
Любой язык - Удаление файла по дате в Имени

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет
Нужна помощь в создании скрипта, который удалял бы файлы, по дате а имени (формата название_yyyymmdd.bd)
Суть в том, что бы оставлять 3-5 самых свежих файла (по дате в названии) остальные удалять


перепробовал совмещать различные варианты, но для примера в CMD\BAT не хочет считывать имя

Код: Выделить весь код
@echo off
SetLocal EnableExtensions

:: папка, с файлами вида yyyymmdd для удаления
set "Folder=C:\temp\test"& set "rs=bd"
 pushd "%Folder%"

For /F "delims=" %%a in ('forfiles /d -3 /m "*%DATE:-4%%DATE:~3,2%%DATE:~6,2%.bd"') do if not defined "%%a" echo del /f /q "%rs%%%a"
exit /b
это не обязательно должен быть cmd/bat
главное, что бы работало
спасибо

Отправлено: 23:19, 14-08-2019

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата kasab:
формата название_yyyymmdd.bd »
«название_» у всех файлов одинаковое?

Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=C:\Мои проекты\0271\Source

for /f "usebackq skip=5 delims=" %%i in (
	`2^>nul dir /b  /a:-d /o:-n "%sSourceFolder%\название_*.bd"`
) do echo del /f /q "%sSourceFolder%\%%~i"

endlocal
exit /b 0
Для реального удаления уберите echo.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:06, 15-08-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


А зачем ориентироваться на дату записанную в названии если у каждого файла и так есть аттрибуты времени? Тот же CreationTime
На Powershell будет выглядеть как-то так:

Код: Выделить весь код
$path = "C:\test\*"
$allfiles = Get-ChildItem -Path $path -Force -File -Include *.bd | select * | Sort-Object -Descending CreationTime
$allfiles[5..($allfiles.Count - 1)] | Remove-Item -WhatIf
Нюансы:
1. Путь должен заканчиваться на \* чтобы корректно отрабатывал фильтр -Include *.bd (это ведь расширение файла, да? Если нет то подставь своё расширение), чтобы в свою очередь работать только с нужными файлами и пропускать скрытые системные файлы, если вдруг они есть.
2. -WhatIf в конце позволяет безболезненно посмотреть что сделает код - увидишь какие файлы будут удалены этим кодом без их фактического удаления.
3. Возможно понадобиться -Force там же, в конце. Зависит от наличия прав.
4. Если когда-нибудь придется изменить количество оставляемых файлов - $allfiles[5..($allfiles.Count - 1)] фильтрует элементы с пятого по последний. Т.к. нумерация элементов в массиве начинается с 0 - приходится отнимать 1 от количества элементов чтобы получить номер последнего ($allfiles.Count - 1), в данном случае для 10 файлов - последний номер 9. Соответственно фильтр $allfiles[5..9] удаляет элементы с пятого по девятый, оставляя элементы с 0го по 4ый (итого 5)

Отправлено: 00:41, 15-08-2019 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Charg:
А зачем ориентироваться на дату записанную в названии если у каждого файла и так есть аттрибуты времени? »
Например, потому, что дата/время в названии файла могут и не иметь отношения к датам создания/последней модификации файла.

Отправлено: 03:32, 15-08-2019 | #4


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
«название_» у всех файлов одинаковое? »
Да, начало названия всегда одинаково, спасибо, потестирую)

Цитата Charg:
А зачем ориентироваться на дату записанную в названии если у каждого файла и так есть аттрибуты времени? Тот же CreationTime »
Это копируемый файл базы, у него всегда одинаковый параметр даты создания, потому добавляется в имя дата копирования

Отправлено: 05:44, 15-08-2019 | #5


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


kasab, я когда-то колхозил с прямо противоположной стороны: в имени бэкапа использовал не дату, а день недели - сама собой получалась авторотация с периодом в неделю. Хотя, конечно, негибко - лёгким движением руки переопределить период не получится (но так ли часто меняются такие настройки).

Цитата kasab:
Это копируемый файл базы, у него всегда одинаковый параметр даты создания »
подсказка: у файла несколько атрибутов времени: дата создания и дата изменения

Отправлено: 11:54, 15-08-2019 | #6


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


Цитата Iska:
Например, потому, что дата/время в названии файла могут и не иметь отношения к датам создания/последней модификации файла. »
Если это бэкап (а это бэкап) то крайне маловероятно что в названии даты что-то кроме даты актуальности этого бэкапа. Не дата создания так дата модификации.

Цитата kasab:
Это копируемый файл базы, у него всегда одинаковый параметр даты создания, потому добавляется в имя дата копирования »
Тогда почему бы не оперировать датой последней модификации файла? Всё равно эта дата будет равняться дате актуальности БД.

Отправлено: 12:09, 15-08-2019 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Charg, дату/время в имена файлов, особенно резервных копий, добавляют совсем не случайно. Ибо упомянутые Вами атрибуты файла внезапно — смертны.

Отправлено: 12:37, 15-08-2019 | #8


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


Цитата Iska:
Ибо упомянутые Вами атрибуты файла внезапно — смертны. »
Каким образом?

Отправлено: 12:41, 15-08-2019 | #9


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Iska, А зачем двойной цикл? Можно так:
Код: Выделить весь код
@Echo Off
	Set "BoxArc=Z:\Box_ARC"
	Set "Mask=Название бэкапа базы_20??????.bd"
	Set /A NSave=5
	FOR /F "usebackq skip=%Nsave% delims=" %%f IN (`2^>nul Dir "%BoxArc%\%Mask%" /B /A:-D /O:-N`) DO Echo Del "%BoxArc%\%%f"
Exit /B
Имхо, еще лучше так:
Код: Выделить весь код
@Echo Off
	Call :DelData "Z:\Box_ARC\Название бэкапа базы_20??????.bd" 5
Exit /B

:DelData
	FOR /F "usebackq skip=%2 delims=" %%f IN (`2^>nul Dir %1 /B /A:-D /O:-N`) DO Echo Del "%~dp1%%f"
Exit /B
Особенно если надо обработать бэкапы нескольких баз
Цитата Iska:
Для реального удаления уберите echo. »

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 15-08-2019 в 12:57.


Отправлено: 12:43, 15-08-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Удаление файла по дате в Имени

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Раскидать файлы по папкам согласно дате в имени файла spkvvs Скриптовые языки администрирования Windows 17 24-01-2024 16:03
VBS/WSH/JS - VBS удаление файлов в папке по определенному имени и дате старше n Vooodi4356 Скриптовые языки администрирования Windows 5 25-03-2018 14:02
CMD/BAT - [решено] Удаление старых файлов по дате и имени, если их больше n NinjaScript Скриптовые языки администрирования Windows 2 04-03-2015 14:27
CMD/BAT - Удаление файлов по дате interminable Скриптовые языки администрирования Windows 1 07-06-2012 15:48
CMD/BAT - Удаление файлов по дате ADGJMPTW Скриптовые языки администрирования Windows 1 10-10-2010 20:08




 
Переход