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

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

Ответить
Настройки темы
CMD/BAT - Удаление всех файлов в папке бекап - кроме первой записи каждого месяца

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


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

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


Изображения
Тип файла: png Безымянный.png
(38.9 Kb, 4 просмотров)
Добрый день! Много пытался читать на форуме информации по необходимой мне информации, но в итоге всё рядом, но опыта не хватает всё собрать воедино, и реализовать.
Если вкратце, есть папка с бекапом, которая каждый день (ночью) - добавляет бекап за предыдущий день. В итоге за месяц получается 30 (28,31) - файлов с бекапом.

Необходимо - удалить все файлы, как с расширением бекапа, так и любые другие, включая .txt (любые) - кроме первой даты каждого месяца.
Останется за год - грубо говоря 12 файлов. (если например говорить за 2016 год). Останется 2017_01_01_dbbuh2014.dt , потом 2017_02_01_dbbuh2014.dt - ну и так далее.
Скрин с папкой самой прилагаю. Нужно чтобы данный батник работал в конкретной папке. Чтобы другие папки в данной папке не трогал.

Заранее буду признателен Вам за помощь.

Отправлено: 08:12, 12-12-2017

 

Ветеран


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

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


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

Far Manager, переходите в каталог, нажимаете серый плюс (на цифровой клавиатуре справа), вводите маску:
Код: Выделить весь код
*.*|/\d{4}_\d{2}_01_dbbuh2014.dt/
нажимаете Ctrl-Enter, тем самым выделяя «лишние» файлы. Убедившись, что выделение верно, нажимаете Shift-Del, Enter.

Отправлено: 09:00, 12-12-2017 | #2



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

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


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


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

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


Цитата Iska:
для одноразового действия скрипты не нужны. »
Увы, но это не одноразовое действие. Таких папок у нас много, и файлов соответстенно много. Плюс в данных папках много лишних ТХТ файлов и прочих не нужных вещей. А что именно нужно оставить в данной папке я писал Выше. Это можно как-то реализовать, не указывая путь, а чтобы батник работал в конкретной папке, в которой он находится.... ?

Отправлено: 09:08, 12-12-2017 | #3


Ветеран


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

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


Цитата fabble86@vk:
Увы, но это не одноразовое действие. Таких папок у нас много, и файлов соответстенно много. Плюс в данных папках много лишних ТХТ файлов и прочих не нужных вещей. А что именно нужно оставить в данной папке я писал Выше. »
Одноразовое. Просто Вы, видимо, любите усложнять.

Ну, если не хотите пользовать Far Manager — вот Вам код на PowerShell:
Код: Выделить весь код
@(
    'C:\Мои проекты\0137',
    'C:\Мои проекты\0138',
    'C:\Мои проекты\0139'
) | ForEach-Object -Process {
    if(Test-Path -LiteralPath $_ -PathType Container) {
        Get-ChildItem -LiteralPath $_ -File | ForEach-Object -Process {
                if($_.Name -notmatch '^\d{4}_\d{2}_01_dbbuh2014.dt$') {
                    Remove-Item -LiteralPath $_.FullName -WhatIf
                }
            }
    } else {
        Write-Host "Can't find source folder [$_]." -ForegroundColor Red
    }
}
В начале перечисляете все потребные каталоги. Маска — та же. Запускаете, смотрите, что предлагается удалить. Если всё нормально — убираете параметр -WhatIf у командлета Remove-Item для реального удаления.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:40, 12-12-2017 | #4


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


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

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


Цитата Iska:
Ну, если не хотите пользовать Far Manager — вот Вам код на PowerShell: »
Для полной ясности, подскажите, если я данный код "запихну" в блокнот, сохранив как батник, он отработает как нужно?

Цитата Iska:
'C:\Мои проекты\0137',
'C:\Мои проекты\0138',
'C:\Мои проекты\0139' »
Это путь к указанным файлам где будет производиться удаление?

Цитата Iska:
В начале перечисляете все потребные каталоги. Маска — та же. Запускаете, смотрите, что предлагается удалить. Если всё нормально — убираете параметр -WhatIf у командлета Remove-Item для реального удаления. »
А что если у меня в 1 папке - 365 файлов, в этой же папке еще с десяток папок, и в каждой из них еще по 365 файлов. Не удалит ли он мне те папки, и их содержимое, если в них не содержится данных бекапа за 1 число. А там лежат файлы бекапа за 10-е числа...?

Я поэтому и хотел это в формате батника, чтобы реализация была конкретно в 1 папке. Так мне кажется безопасней.

Цитата Iska:
Одноразовое. Просто Вы, видимо, любите усложнять. »
Я согласен что оно одноразовое, НО для одной конкретной папки. А что если у нас их действительно много? Не 5, и не 10. Просто само действие будет однотипно для всех папок...

Отправлено: 09:51, 12-12-2017 | #5


Ветеран


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

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


Цитата fabble86@vk:
Для полной ясности, подскажите, если я данный код "запихну" в блокнот, сохранив как батник, он отработает как нужно? »
Нет, не отработает. Вам нужно сохранить его в файл с расширением .ps1, плюс однократно разрешить для PowerShell'а исполнение неподписанных локальных скриптов (Set-ExecutionPolicy -ExecutionPolicy RemoteSigned).

Цитата fabble86@vk:
Это путь к указанным файлам где будет производиться удаление? »
Пути к каталогам с искомыми файлами. Вместо них Вы вписываете потребное количество своих путей.

Цитата fabble86@vk:
А что если у меня в 1 папке - 365 файлов, в этой же папке еще с десяток папок, и в каждой из них еще по 365 файлов. Не удалит ли он мне те папки, и их содержимое, »
Вложенные каталоги и файлы в них не участвуют в обработке, поскольку для командлета Get-ChildItem не указан булевый параметр -Recurse. Сами каталоги вообще не подвергаются какой-либо обработке, поскольку используется параметр -File. Например, если в каком-либо из указанных Вами каталогов окажется каталог с именем «2017_01_02_dbbuh2014.dt» — он не будет удалён.

Цитата fabble86@vk:
Я поэтому и хотел это в формате батника, чтобы реализация была конкретно в 1 папке. Так мне кажется безопасней. »
Цитирую сам себя:
Цитата Iska:
Запускаете, смотрите, что предлагается удалить. Если всё нормально — убираете параметр -WhatIf у командлета Remove-Item для реального удаления. »
То есть — данный скрипт в неизменном виде вообще ничего не удаляет. И не будет удалять, а только показывать, что он будет удалять, когда Вы уберёте из кода параметр -WhatIf.

Цитата fabble86@vk:
А что если у нас их действительно много? Не 5, и не 10. »
Хоть пять тысяч. Просто перечисляете их там, где я указал.

Отправлено: 10:06, 12-12-2017 | #6


Ветеран


Contributor


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

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


Цитата fabble86@vk:
Нужно чтобы данный батник работал в конкретной папке. »
Указывайте конкретные папки и маску в Call :DirBack
Код: Выделить весь код
@Echo Off

Call :DirBack "Z:\Box_Arc\Папка с бэкапами 1\" "20??_??_??_*.dt"
Call :DirBack "Z:\Box_Arc\Папка с бэкапами 2\" "20??_??_??_*.dt"
Call :DirBack "Z:\Box_Arc\Папка с бэкапами 3\" "20??_??_??_*.dt"

GoTo :Eof

:DirBack
	Set "Last="
	Set "Ext="
	FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:EN "%~1%~2" 2^>nul`) DO Call :DelBack "%~1" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
	If "%Last%"=="%~2%~3" If "%Ext%"=="%~x5" Del "%~1%~2_%~3_%~4_%~5" &GoTo :Eof
        Set "Last=%~2%~3"
	Set "Ext=%~x5"
GoTo :Eof
Цитата fabble86@vk:
а чтобы батник работал в конкретной папке, в которой он находится.... ? »
В этом случае оставьте один
Call :DirBack
Код: Выделить весь код
Call :DirBack "%~dp0" "20??_??_??_*.dt"
Если в папке находятся файлы по датам с разным расширением, и по каждому расширению надо оставить только один файл за месяц, укажите маску
"20??_??_??_*.*"

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


Последний раз редактировалось megaloman, 12-12-2017 в 14:28.


Отправлено: 13:21, 12-12-2017 | #7


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


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

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


Цитата megaloman:
В этом случае оставьте один
Call :DirBack »
Прописал так. Поменял только путь, и оставил один DirBack, но не работает почему-то... проверяю файл на бекапе от бекапа , скажем так. чтобы случайно не удалить то что нельзя удалять)

@Echo Off

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt"

GoTo :Eof

:DirBack
Set "Last="
FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:N "%~1%~2" 2^>nul`) DO Call :DelBack "%~1" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
If Not "%Last%"=="%~2%~3" Set "Last=%~2%~3" &GoTo :Eof
echo Del "%~1%~2_%~3_%~4_%~5"
GoTo :Eof

Цитата megaloman:
fabble86@vk, Я изменял скрипт для расширения функционала, используйте посленюю версию »
почему то не работает(

Отправлено: 14:50, 12-12-2017 | #8


Ветеран


Contributor


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

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


Я организовал у себя Вашу папку, добавил в скрипт некоторую защиту от неверных данных. У меня работает. Пробуйте
Код: Выделить весь код
@Echo Off

Call :DirBack "C:\Users\s.andrashenko\Desktop\New" "20??_??_??_*.dt"

GoTo :Eof

:DirBack
	If Not Exist %1 (Echo Folder not found %1 &Pause &GoTo :Eof)
	Set "InDir=%~1"
	If Not "%InDir:~-1%"=="\" Set "InDir=%InDir%\"
	Set "Last="
	Set "Ext="
	FOR /F "usebackq tokens=1,2,3* delims=_" %%i IN (`Dir /B /A:-D /O:EN "%Indir%%~2" 2^>nul`) DO Call :DelBack "%Indir%" "%%i" "%%j" "%%k" "%%l"
GoTo :Eof

:DelBack
	If "%Last%"=="%~2%~3" If "%Ext%"=="%~x5" Del "%~1%~2_%~3_%~4_%~5" &GoTo :Eof
        Set "Last=%~2%~3"
	Set "Ext=%~x5"
GoTo :Eof

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

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

Отправлено: 18:02, 12-12-2017 | #9


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


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

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


Цитата megaloman:
Я организовал у себя Вашу папку, добавил в скрипт некоторую защиту от неверных данных. У меня работает. Пробуйте »

Проверил, действительно работает. Спасибо

Цитата megaloman:
Я организовал у себя Вашу папку, добавил в скрипт некоторую защиту от неверных данных. У меня работает. Пробуйте »
А еще один вопрос. Можно как-нибудь дописать строчку про удаление остальных файлов расширения .txt - поскольку они там тоже встречаются, но они вообще никакие не нужны. Главное это бекапы которые вы сделали. Спасибо.

И если можно данную строчку дописать. то куда её там вставить..

Отправлено: 06:42, 13-12-2017 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Удаление файлов старше N дней в подпаках, кроме файлов в самой папке Negtm Скриптовые языки администрирования Windows 4 03-02-2017 15:30
CMD/BAT - Bat, который бы удалял все файлы, кроме созданных в начале каждого месяца. Tyamich Скриптовые языки администрирования Windows 10 29-07-2016 17:10
CMD/BAT - [решено] Удаление всех файлов (всех типов) из всех подпапок, кроме расширений txt kot318 Скриптовые языки администрирования Windows 10 12-02-2015 15:48
CMD/BAT - Удаление всех файлов из папки кроме батника composter Скриптовые языки администрирования Windows 11 30-03-2013 08:25
CMD/BAT - Удаление всех файлов кроме одного в подпапках SELFY Скриптовые языки администрирования Windows 2 29-07-2012 15:34




 
Переход