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

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

Ответить
Настройки темы
Любой язык - [решено] Поиск и подсчет файлов содержащие одинаковые названия.

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


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

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


Изменения
Автор: ownsmir
Дата: 21-06-2019
Описание: Не поставил оповещения
Здравствуйте! Прошу помочь с написанием скрипта (Не важно cmd или ps)
Объясню суть:
Каждый день происходит бэкап баз 1С (средствами sql) их порядка 380+ шт. Соответственно диск заполняется за 8 дней. Вручную надоело удалять старые бэкапы.
Но периодически бывает что базы удаляю с сервера, но бэкапы этой базы нужно сохранить (мало ли)
Хочу сделать скрипт который будет:
1) Подсчитывать количество файлов содержащих одинаковое название (начало названия файла с бэкапом это название базы, оно в каждом бэкапе этой базы одинаковое, а далее через _ идет уже разные значения (день и т.д.))
2) Если насчитывается более 5 шт файлов содержащих одинаковое название, эти файлы проверяются по дате и удаляются все старше 5 дней (5шт = 5дней), чтобы файлы которые меньше 5 шт оставались без изменений (как раз те которые просто нужно сохранить)
Очень надеюсь на вашу помощь, сам не смогу знаний не хватает.

Отправлено: 14:30, 21-06-2019

 

Старожил


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

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


1
Get-ChildItem -Path C:\Backup1C | Group-Object {$_.BaseName.split("_")[0]}

2
Цитата ownsmir:
эти файлы проверяются по дате »
взятой от куда? из имени файла или даты создания файла?
если из имени, нужен образец форматов

Последний раз редактировалось Ageron, 21-06-2019 в 15:21.

Это сообщение посчитали полезным следующие участники:

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



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

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


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


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

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


2
Цитата ownsmir:
эти файлы проверяются по дате »
взятой от куда? из имени файла или даты создания файла?
если из имени, нужен образец форматов

Из даты создания файлов

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

Отправлено: 15:22, 21-06-2019 | #3


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
	Set "BoxIn=Z:\Box_In"
	Set "Mask=*_*.bak"
	Set /A N=5

	Set "Log=Z:\Box_In\%Date%.Log"

	FOR %%f IN ("%BoxIn%\%Mask%") DO Call :MemoBak "%%f"
	FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@"`) DO (
		FOR /F "usebackq skip=%N% delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%j" /B /A:-D /O:-D /T:C`) DO (
			>>"%Log%" Echo Del "%BoxIn%\%%f"
			Del "%BoxIn%\%%f"
		)
	)
Exit /B

:MemoBak
	FOR /F "tokens=1,* delims=_" %%i IN ("%~n1") DO If Not "%%j"=="" Set "@@%%i=%%i_*%~x1"
Exit /B

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:04, 21-06-2019 | #4


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


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

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


Цитата megaloman:
@Echo Off
Set "BoxIn=Z:\Box_In"
Set "Mask=*_*.bak"
Set /A N=5
Set "Log=Z:\Box_In\%Date%.Log"
FOR %%f IN ("%BoxIn%\%Mask%") DO Call :MemoBak "%%f"
FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@"`) DO (
FOR /F "usebackq skip=%N% delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%j" /B /A:-D /O:-D /T:C`) DO (
>>"%Log%" Echo Del "%BoxIn%\%%f"
Del "%BoxIn%\%%f"
)
)
Exit /B
:MemoBak
FOR /F "tokens=1,* delims=_" %%i IN ("%~n1") DO If Not "%%j"=="" Set "@@%%i=%%i_*%~x1"
Exit /B »
Ни в CMD ни в PS не работает почему то. Поменял только путь и путь лога

Отправлено: 16:45, 21-06-2019 | #5


Старожил


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

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


Код: Выделить весь код
$a=Get-ChildItem -Path C:\Backup1C | select creationtime, basename, fullname | Group-Object {$_.BaseName.split("_")[0]}
foreach ($c in $a) {if ($c.count -cgt 5) {$c.Group | Sort-Object creationtime | Select-Object -First ($C.count - 5) | Remove-Item -Force}}
-
чтобы просто посмотреть какие файлы попадут под удаление, уберите из кода "| Remove-Item -Force"

Цитата ownsmir:
Ни в CMD ни в PS не работает почему то. Поменял только путь и путь лога »
запустили powershell окно, скопировали код в него, запустили.... и? не работает? ошибка то какая?
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:48, 21-06-2019 | #6


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


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

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


Цитата Ageron:
запустили powershell окно, скопировали код в него, запустили.... и? не работает? ошибка то какая? »
строка:1 знак:7
+ @Echo Off
+ ~~~
Непредвиденная лексема "Off" в выражении или операторе.
строка:8 знак:5
+ FOR %%f IN ("%BoxIn%\%Mask%") DO Call :MemoBak "%%f"
+ ~
Отсутствует открывающий знак "(" после ключевого слова "for".
строка:9 знак:5
+ FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@"`) DO (
+ ~
Отсутствует открывающий знак "(" после ключевого слова "for".
строка:11 знак:36
+ >>"%Log%" Echo Del "%BoxIn%\%%f"
+ ~
Отсутствует закрывающий знак ")" в выражении.
строка:14 знак:3
+ )
+ ~
Отсутствует закрывающий знак ")" в выражении.
строка:18 знак:5
+ FOR /F "tokens=1,* delims=_" %%i IN ("%~n1") DO If Not "%%j"=="" Set "@@%%i=%%i ...
+ ~
Отсутствует открывающий знак "(" после ключевого слова "for".
строка:1 знак:1
+ @Echo Off
+ ~~~~~
Оператор с символом "@" невозможно использовать для ссылки на переменные в выражении. "@Echo" может использоваться только как аргумент для команды. Для
ссылки на переменные в выражении используйте "$Echo".
+ CategoryInfo : ParserError: ( [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

Отправлено: 17:18, 21-06-2019 | #7


Ветеран


Contributor


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

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


ownsmir, Фаил надо сохранить как .bat. Запускать как исполнимый файл, например, в проводнике. С какой маской хранятся ваши файлы? У меня сейчас маска *_*.bak (то есть имябазы_чтотоеще.bak). У Вас расширение бэкапов какое? В скрипте .bak Имябазы не должно содержать _.
Переименуйте ваш скрипт в .txt, приложите к сообщению.
Неплохо бы сделать Dir "Папка с бэкапами" *.* >C:\txt.txt и приложить к сообщению, чтобы понять способ формирования имен .

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:18, 21-06-2019 | #8


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


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

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


Цитата Ageron:
Код:
$a=Get-ChildItem -Path C:\Backup1C | select creationtime, basename, fullname | Group-Object {$_.BaseName.split("_")[0]}
foreach ($c in $a) {if ($c.count -cgt 5) {$c.Group | Sort-Object creationtime | Select-Object -First ($C.count - 5) | Remove-Item -Force}}
-
чтобы просто посмотреть какие файлы попадут под удаление, уберите из кода "| Remove-Item -Force" »
А чтобы это все в файл писалось как сделать?

Цитата megaloman:
ownsmir, Фаил надо сохранить как .bat. С какой маской хранятся ваши файлы? У меня сейчас маска имябазы_чтотоеще.bak. У Вас расширение бэкапов какое? В скрипте .bak Имябазы не должно содержать _.
Переименуйте ваш скрипт в .txt, приложите к сообщению.
Неплохо бы сделать Dir "Папка с бэкапами" *.* >C:\txt.txt и приложить к сообщению, чтобы понять способ формирования имен . »

Прошу меня извинить! все работает! Единственное в таком формате лог, не совсем ясно что именно удалено
Del "B:\SQLH\SQL17.Backup\ђЂ‰’ ‘Ђ‰„,ЋЋЋ_backup_2019_06_16_230018_9065042.bak"
Del "B:\SQLH\SQL17.Backup\’„ Љ‡Њ, ЋЋЋ_backup_2019_06_16_230023_1953987.bak"

Отправлено: 17:19, 21-06-2019 | #9


Ветеран


Contributor


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

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


ownsmir, Результат можно прочесть в редакторе, поддерживающем 866 кодировку.
Батники работают именно в этой кодировке по умолчанию.
Но можно добавить строку
Код: Выделить весь код
@Echo Off
	>nul chcp 1251
	.........
	.........
и в блокноте оно будет читаться нормально

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:35, 21-06-2019 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Поиск и сортировка файлов по части названия registeruser1 Скриптовые языки администрирования Windows 4 04-05-2017 09:21
CMD/BAT - Необходимо из множества файлов скопировать строки содержащие слово Борис_Спектор@vk Скриптовые языки администрирования Windows 3 02-02-2017 19:13
Мультимедиа - Одинаковые превью у видео файлов alleclf Программное обеспечение Windows 3 20-08-2013 09:34
CMD/BAT - [решено] Скопировать названия файлов из папки и добавить символ в конец названия kiber31 Скриптовые языки администрирования Windows 6 17-08-2012 14:04




 
Переход