Войти

Показать полную графическую версию : [решено] Поиск и подсчет файлов содержащие одинаковые названия.


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

Ageron
21-06-2019, 15:08
1
Get-ChildItem -Path C:\Backup1C | Group-Object {$_.BaseName.split("_")[0]}

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

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

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

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

megaloman
21-06-2019, 16:04
@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

ownsmir
21-06-2019, 16:45
@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 не работает почему то. Поменял только путь и путь лога

Ageron
21-06-2019, 16:48
$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"

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

ownsmir
21-06-2019, 17:18
запустили 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

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

ownsmir
21-06-2019, 17:19
Код:
$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, Фаил надо сохранить как .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"

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

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

Код: Выделить весь код
$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"


Супееер!! Огонь! Спасибо вам огромное! Счастья и добра вам!




© OSzone.net 2001-2012