Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Архивирование и удаление файлов в папке старше n дней (http://forum.oszone.net/showthread.php?t=309724)

ryoryoryo 28-12-2015 17:15 2589199

Архивирование и удаление файлов в папке старше n дней
 
Добрый день, знаю тем подобных много, пересмотрел разные и что накопал хотелось бы доработать. Пожалуйста посмотрите.
Архивирование:
Код:

Set Gde1=D:\тест
Set Gde2=D:\тест2
Set Gde3=D:\тест3

Set Kuda=D:\тест1

Set TDate=%date:~6,4%"."%date:~3,2%"."%date:~0,2%

"%programfiles%\WinRar\Winrar.exe" a -r -ed -m1 -df -to7d %Kuda%\%TDate%_почта.rar %Gde1%\*.*
"%programfiles%\WinRar\Winrar.exe" a -r -ed -m1 -df -to7d %Kuda%\%TDate%_сканы.rar %Gde2%\*.*
"%programfiles%\WinRar\Winrar.exe" a -r -ed -m1 -df -to7d %Kuda%\%TDate%_загрузки.rar %Gde3%\*.*

Так как есть папки сканов и загрузок их тоже архивируем. Все работает, вопрос только грамотно ли я оформил этот скрипт, в смысле каждая переменная для каждой архивируемой папки?
Папка "Почта" в общем доступе, нужны какие то манипуляции для удачного удаления и архивирования, если вдруг кто то открыл файлы?
Архиватор не удаляет в "Почте" папки структуры(D:\Почта\Отдел(Экономический, Юридический и тд.)\In(Out)), как и все остальные (ключ -ed).
Нашел такой код для удаления пустых папок с исключением:
Код:

Set Folder=D:\тест
Set NoFolDel=D:\тест\Бухгалтерия\In

Cd /D "%NoFolDel%"
FOR /F "tokens=*" %%f IN ('Dir "%Folder%\*.*" /B /S /A:D  2^>nul^|Sort /R') DO  Rd "%%f" 2>nul

Как изменить код, чтобы удалялись лишние пустые папки со всех уровней кроме структурных?

XaHAleX 13-01-2016 10:35 2594185

Аналогичная проблема: необходимо обходить подкаталоги с проверкой даты файлов с последующим архивированием с помощью 7z, причем каждый файл архивируется отдельно в каталог расположения файла, где имя архива = имя файла. После выполнения архивирования файл удаляется.
Получаю список файлов помощью кода:
Код:

forfiles /p D:\ /s /m *.txt /d -180 /C "cmd /c echo @path">d:\temp\arh_file.txt
но в этом случае в файле получаю первую пустую строку и путь к файлу в кавычках:

"D:\temp1\20130830000000.txt"
"D:\temp2\20130831000000.txt"
и т.д.
Поэтому решил попробовать просто передавать в другой исполняемый файл имя файла для архивирования:
Код:

forfiles /p D:\ /s /m *.txt /d -180 /C "cmd /c D:\temt\1.bat @file"
по описанию в случае выполнения данного кода вызов 1.bat должен происходить такое же количество раз, сколько найдено файлов. Но, во-первых, срабатывает только один раз; во-вторых, не отображает значение @file, хотя 1.bat для проверки состоит из одной строки:
Код:

echo @file
Кто подскажет, где ошибка и каким образом еще можно решить проблему?

Georgio 13-01-2016 21:30 2594508

1. "@file" и "@path" -- это внутренние переменные утилиты "forfiles.exe", и оперировать ими может только сама эта утилита, поэтому их использование за пределами параметра c ключом "/C" команды "FORFILES" невозможно.


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

Код:

@echo off

for /f "delims=" %%i in ('
 forfiles /p D:\ /s /m *.txt /d -180 /c "cmd /c echo @path"
') do (
 "%ProgramFiles%\7-Zip\7z.exe" a "%%~dpni.7z" %%i
 del /a /f %%i
)

.

XaHAleX 14-01-2016 13:35 2594778

При выполнении скрипта выдает ошибку: "ERROR: No files found with the specified search criteria." :cry: :dont-know.
Хотя файл точно есть, проверял.

alpap 15-01-2016 01:28 2595122

XaHAleX, файлы не найдены по заданным критериям поиска, ну и попробуйте поставить, например, /d -1.

XaHAleX 15-01-2016 06:26 2595147

Georgio, спасибо, работает! только поменял ключ на удаление: del /q /f
alpap, сорри, недосмотрел. Глупо получилось: проверял скрипт на следующий день, действительно ни один файл уже не попадал в отбор.
Окончательная версия кода:
Код:

@echo off
for /f "delims=" %%i in ('forfiles /p D:\ /s /m *.txt /d -180 /c "cmd /c echo @path"') do (
"%ProgramFiles%\7-Zip\7z.exe" a "%%~dpni.zip" %%i
echo %date% %time% Arhiv "%%i" >> d:\temp\arh_files.txt
del /q /f %%i
echo %date% %time% Erase "%%i" >> d:\temp\arh_files.txt
)


ryoryoryo 15-01-2016 15:43 2595378

Вложений: 1
Вот написал такой скрипт, не судите строго, может пригодится кому-то
Код:

@echo off
rem *************************************************************************************
rem                                                                        ****Переменные****                                                                      *
rem *************************************************************************************
rem Папка в которую складываются архивы
Set Kuda="D:\Program Files\Trash"
rem Файл-список в котором записаны названия папок для бекапа и удаления старых файлов       
set List="D:\Program Files\Batch\bak.lst"

rem Если архив с текущей датой существует - отмена бекапа
::If Exist загрузки_%Date%.rar GoTo End

Echo.
Echo  #*******************************#
Echo  * Бэкап начнется через 10 сек.  *
Echo  *-------------------------------*
Echo  * Запуск - нажми 1              *
Echo  * Отмена - нажми 2              *
Echo  #*******************************#
Echo.

rem При запуске скрипта есть выбор, автоматически через 10 секунд запустится архивация.
Choice /c 12 /t 10 /d 1
rem Переменные ErrorLevel определяют выбор пользователя или по истечению 10 сек. запускается бекап
If Errorlevel 2 Goto :Cancel
If Errorlevel 1 Goto :Start
Goto End


:Start
rem *************************************************************************************
rem                                                        ****WinRAR**** архивация                                                                *
rem A Добавить файлы в архив                                                                                                                          *
rem -r Включить в обработку вложенные папки                                                                                                *
rem -ed Не добавлять пустые папки                                                                                                                  *
rem -ep1 Исключить базовую папку из имён                                                                                                  *
rem -ibck Запустить WinRAR как фоновый процесс в области уведомлений (системном лотке)  *
rem -m<n> Метод сжатия                                                                                                                                  *
rem -df Удалить файлы после архивации                                                                                                          *
rem -to<время> Обрабатывать файлы более старые, чем указанный период времени                          *
rem -ilog[имя] Записывать протокол ошибок в файл                                                                                  *
rem -log[формат][=имя] Записать имена в файл-протокол                                                                        *
rem ^ перенос строк                                                                                                                                                *
rem *************************************************************************************
Echo Архивируется...
"%programfiles%\WinRar\Winrar.exe" a -r -ed -ep1 -ibck ^
-ilog%Kuda%\%date%_backup.log -logf=%Kuda%\%date%_backup.txt ^
-m1 -df -to5h %Kuda%\%date%_backup.rar @%List%
rem Проверка архивации, если 0, то готово, если не 0, то ошибка
if errorlevel = 0 (Echo Архивация завершена!) ELSE (Echo Ошибка!)
rem Код ошибки, если нужна информация
Echo %ErrorLevel%
rem Отчет добавляем в архив
If exist %Kuda%\%date%_backup.txt "%programfiles%\WinRar\Winrar.exe" a ^
-ep -ibck -df -m1 %Kuda%\%date%_backup.rar %Kuda%\%date%_backup.txt
if errorlevel = 0 (echo Отчет внутри архива!) Else (echo Отчета нет!)

rem *************************************************************************************
rem                        ****Циклическая проверка запущен ли WinRar.exe****                                                *
rem Если запущен - повторяется проверка, если нет - начинается очистка пустых папок                *
rem *************************************************************************************
:checker
tasklist /FI "IMAGENAME eq winrar.exe" /NH | findstr /i "winrar.exe">nul
if %errorLevel% == 0 goto :checker
echo Вин рар завершил работу

rem *************************************************************************************
rem                        ****Удаление пустых папок из списка bak.lst****                                                *
rem Если в файл-списке записана папка из нее удаляются все пустые папки и подпапки                *
rem *************************************************************************************

rem Переключение кодировки в ANSI 1251 для распознавания русских названий папок.
rem 1>nul это скрытие вывода в консоли информации о переключении кодировки.
1>nul chcp 1251

goto start
:fn1
rem Для правильного отображения переключаем кодировку обратно.
1>nul chcp 866
for /d %%i in ("%~1\*") do (
        call :fn1 "%%i"
        rd /q "%%i"
)
exit /b
:start
rem Функция отбора папок в файл-списке.
FOR /F "usebackq delims=" %%a in (%List%) do call :fn1 %%a

rem удаление архивов старше 30 дней
FORFILES /p %Kuda% /S /D -30 /C "cmd /c del @path /f /q"

GoTo End



:Cancel
echo Отмена.
goto end

Файл bak.lst содержит названия папок для бэкапа. Более подробно описано в справке winrar (только берите винрар от 5-ой версии, там есть лог)

sindrom_89 30-05-2017 12:05 2740757

Коллеги, добрый день.
Подскажите, как написать данный скрипт.

Нужна написать bat, который будет архивировать дампы БД по маске KoDB*.bak которые старше "today - 7 days" и перемещать их в папку c архивами (из папки D:\BackUpDB файлы которые уже заархивированы - удалить)
Путь к папке где лежат дампы - D:\BackUpDB
Путь к папке куда переместить заархивированные дампы - D:\Archive
Далее из папки D:\Archive копировать в папку D:\Archive\OLD файлы всех архивов 15 и 30 числа каждого месяца.
Использовать WinRAR

megaloman 30-05-2017 21:37 2740881

sindrom_89, Давайте уточним:
1. Надо (ежедневно?) архивировать (с удалением заархивированных) файлы D:\BackUpDB\KoDB*.bak старше 7 дней в папку D:\Archive
Вопрос: с каким именем, как оно образуется? Или в один архив (опять же, с каким именем?) ? Периодичность архивации (ежедневно?)?
2.
Цитата:

Цитата sindrom_89
папки D:\Archive копировать в папку D:\Archive\OLD файлы всех архивов 15 и 30 числа каждого месяца »

Логика вопроса требует не копировать, а перемещать. Да и 30 февраля выглядит как-то одиозно. Может быть 1-го и 15?
Вот вариант, укажите правильно пути
Код:

@Echo Off
cls
:В системе дата должна быть в формате ДД.ММ.ГГГГ

Set "BoxIn=Z:\Box_In"
Set "Mask=KoDB*.bak"

Set "BoxOut=Z:\Box_Out"
Set "BoxArc=Z:\Box_Out\Old"

Set /A ND1=1
Set /A ND2=15
Set /A DOld=7

Set "Arc="C:\Program Files\WinRAR\WinRar.exe" a -ep -to%DOld%d -df"

Set "DD=%Date:~0,2%"
Set "MM=%Date:~3,2%"
Set "YYYY=%Date:~6,4%"

Set /A ND=1%DD%-100

Set /A DD1=%ND1%+100
Set "DD1=%DD1:~-2%"

Set /A DD2=%ND2%+100
Set "DD2=%DD2:~-2%"

If %ND1% LEQ %ND% If %ND% LSS %ND2% Set "NameDir=%YYYY%%MM%%DD1%"
If %ND% GEQ %ND2% Set "NameDir=%YYYY%%MM%%DD2%"

If Not Exist "%BoxArc%\%NameDir%\*.*" (
        Md "%BoxArc%\%NameDir%"
        Move /Y "%BoxOut%\*.*" "%BoxArc%\%NameDir%\" >nul
)
%Arc% "%BoxOut%\%YYYY%%MM%%DD%.rar" "%BoxIn%\%Mask%"
GoTo :Eof


Как это работает:
Лучше всего батник поместить в планировщик и выполнять каждый день (хотя можно и чаще, можно и реже)
До начала архивации в батнике анализируется день в дате.
Если день, допустим, 1<=ДД<15, или ДД>=15 и нет папки соответственно BoxArc\ГГГГММ01 или BoxArc\ГГГГММ15, то эта папка создаётся и всё содержимое папки BoxOut переносится туда.
Далее архивируются файлы из папки BoxIn по указанной маске старше указанного количества дней в папку BoxOut под именем ГГГГММДД.rar Архиватор удаляет исходные файлы.

sindrom_89 31-05-2017 13:29 2741044

megaloman, есть небольшое уточнение

нужно перемещать из папки D:\Archive в папку D:\Archive\OLD только те файлы, у которых в наименовании, после KoDB_2017(год)05(месяц) идет 30 или 15
KoDB_20170530090001
KoDB_20170515090000

Спасибо за интересное решение, очень благодарен!

megaloman 31-05-2017 18:22 2741123

sindrom_89,
Цитата:

Цитата sindrom_89
Спасибо за интересное решение, очень благодарен! »

Пожалуйста, но оно не оказалось для Вас полезным.
Опять начинаем с постановки задачи, которую Вы изложили и к которой есть вопросы:
Нужно написать bat, который будет архивировать дампы БД по маске KoDB*.bak которые старше "today - 7 days" Откуда берётся дата файла? Из свойств файла или она содержится в имени? Что Вы хотите, чтобы каждый файл по маске архивировался отдельно и имя архива совпало с именем файла ? Подробнее сообщите формат имени файла. Подозреваю, что каждый файл с именем типа:
KoDB_ГГГГММДДхххххх.bak должен заархивироваться в файл KoDB_ГГГГММДДхххххх.rar или KoDB_ГГГГММДДхххххх.bak.rar. Это так?
Иначе откуда возьмутся заархивированные файлы в папке D:\Archive с именем KoDB_20170530090001 или KoDB_20170515090000?

KOTBUS 08-04-2021 14:29 2955236

Добрый день. Подскажите плиииз.
С копированием я разобрался:
xcopy \\192.168.100.100\name\name2\name.bak D:\name /f /y
Как мне заставить архивироваться уже скопированный файл name.bak в папку D:\name с дальнейшим удалением исходного name.bak ??

alpap 08-04-2021 15:11 2955239

Код:

7z a D:\name.zip name.bak -sdel

KOTBUS 09-04-2021 09:31 2955291

А путь к 7z прописывать не нужно? И путь у меня D:\name\name.bak, а архивировать я хочу сам файл в папке а не всю папку.
не правильнее было бы
7z a D:\name\name.zip name.bak -sdel

Iska 09-04-2021 15:19 2955335

Цитата:

Цитата KOTBUS
А путь к 7z прописывать не нужно? »

Если у Вас путь к исполняемому файлу 7z.exe/7za.exe содержится в PATH — то не нужно. Если не содержится — то нужно.

Цитата:

Цитата KOTBUS
И путь у меня D:\name\name.bak, а архивировать я хочу сам файл в папке а не всю папку.
не правильнее было бы
7z a D:\name\name.zip name.bak -sdel »

Рекомендуется а) более чётко ставить техзадание изначально и б) ознакомиться с документацией 7-Zip. И тогда можно уже будет задавать конкретные вопросы: «мои исходные условия такие-то, я попробовал сделать вот так, получил вот то-то и то-то, а мне нужно вот то-то и то-то».


Время: 07:36.

Время: 07:36.
© OSzone.net 2001-