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

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

it3 13-09-2018 15:24 2831198

backup файлов прошлого месяца
 
Добрый день!
Есть необходимость написать BAT-файл, который бы архивировал файлы прошлого месяца и складывал в отдельную папку.
Вот мои наброски - но что то пошло не так (не работает). Подсобите пожалуйста.
Код:

@echo on

set  param=%1
set source=f:\Share\LOGS\%param:"=%
set  dst=%source%\bkp
set  dst_tmp=%dst%\tmp

echo %date%
set d=%date:~0,2%
set /a m=%date:~3,2%-1
set y=%date:~6,4%

if %m:~0,1% neq 1 set m=0%m%
set date_prep=%y%%m%%d%
set date_ym=%y%%m%
echo %date_prep%

if not exist "%dst%" md "%dst%"
if not exist "%dst_tmp%" md "%dst_tmp%"
pause
if %param% == "bkp" goto expt
goto for

:expt
echo "ќвг Ї*ЇЄг *Ґ ва®Ј*Ґ¬"
goto end

:for
forfiles /m *%date_ym%*.* -p "%source%"  /C  "cmd /c move @file \"%dst_tmp%\""

goto bkp

:bkp
"%ProgramFiles(x86)%\7-Zip\7z.exe" a -tzip -mx9 "%dst%\%param:"=%_%date_ym%.zip" "%dst_tmp%\*.*"
IF %ERRORLEVEL%==0 goto ok
goto end
:ok
del "%dst_tmp%\*.*"  /q
rd "%dst_tmp%"
goto end

:end


it3 14-09-2018 06:14 2831284

Цитата:

Цитата megaloman
Как понимать, файлы, изменённые/созданные только в прошлом месяце? Изменённые в другом месяце не рассматриваем? »

Прошу прощения. Все файлы, кроме файлов текущего месяца.

Busla 14-09-2018 11:07 2831306

it3, не надо в батниках пытаться работать с датой - потом запустите его в системе с другой локалью и получите полный ахтунг. Пользуйтесь WSH, PoSh.

it3 15-09-2018 11:31 2831415

Цитата:

Цитата Busla
it3, не надо в батниках пытаться работать с датой - потом запустите его в системе с другой локалью и получите полный ахтунг. Пользуйтесь WSH, PoSh. »

Подсобите пожалуйста.

YuS_2 15-09-2018 13:48 2831426

Цитата:

Цитата it3
Подсобите пожалуйста. »

Для того, чтобы подсобить, необходимо сначала определиться в чём.
Опишите подробнее условия и что именно требуется.
Архивируются все файлы или определенного типа, или целиком каталог с подкаталогами? и т.д., и т.п.

it3 15-09-2018 14:37 2831447

Цитата:

Цитата YuS_2
Для того, чтобы подсобить, необходимо сначала определиться в чём.
Опишите подробнее условия и что именно требуется.
Архивируются все файлы или определенного типа, или целиком каталог с подкаталогами? и т.д., и т.п. »

Есть каталоги:
W:\LOGS\Folder1\
W:\LOGS\Folder2\
W:\LOGS\Folder3\
W:\LOGS\Folder4\
В них находятся *.txt файлы разного наименования.
Необходимо, чтобы все файлы, кроме тех что созданы в текущем месяце, архивировались и складывались сюда с таким именем:
W:\LOGS\Folder1\bkp\Folder1_201805.zip
W:\LOGS\Folder2\bkp\Folder2_201806.zip
W:\LOGS\Folder3\bkp\Folder3_201807.zip
W:\LOGS\Folder4\bkp\Folder4_201808.zip

megaloman 15-09-2018 20:55 2831501

it3,
Вот решение по Вашей идеологии, пропишите свои пути и подпапки
Если конкретно указывать папки, то
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Share\LOGS"
        Set "SubBox="Folder1" "Folder2" "Folder3" "Folder4""
        Set "Mask=*.txt"
rem        Set "Mask=*.*"

        Set ARC="%ProgramFiles(x86)%\7-Zip\7z.exe" a -tzip -mx9 -sdel
rem        Set ARC="%ProgramFiles%\7-Zip\7z.exe" a -tzip -mx9 -sdel


        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
        Set "Xdate=%Tdate:~4,2%-01-%Tdate:~0,4%"
        Set /A Zdate=%Tdate:~0,4%%Tdate:~4,2%
        If %Zdate:~4,2%==01 (Set /A Zdate=%Zdate%-89) Else (Set /A Zdate=%Zdate%-1)

        For %%d In (%SubBox%) Do Call :ArcDir "%BoxIn%" "%%~d" "%Mask%" "%Xdate%" "%Zdate%"
Pause
GoTo :Eof

:ArcDir
        Echo "%~1\%~2\%~3" "%~2_%~5" 

        Set "Source=%~1\%~2"
        Set "Dst=%Source%\bkp"
        Set "Dst_Tmp=%Dst%\tmp"
        If Not Exist "%Dst_Tmp%" md "%Dst_Tmp%"
        Pushd "%Dst_Tmp%" || (Echo "%Dst_Tmp%" not found &Exit /B 1)

        xcopy /l /D:%~4 "%Source%\%~3" "%Tmp%" >"%Dst_Tmp%\~tmp.tmp" 2>nul
        FOR /F "usebackq delims=" %%f in (`xcopy /L /D /Exclude:~tmp.tmp "%Source%\%~3"`) DO If Exist "%%f" Move /Y "%%f" "%Dst_Tmp%\" >nul
        Del ~tmp.tmp

        %Arc% "%Dst%\%~2_%~5.zip" %3 >nul

        Popd
GoTo :Eof

Если обработать все подпапки указанной папки
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Share\LOGS"
        Set "Mask=*.txt"

        Set ARC="%ProgramFiles(x86)%\7-Zip\7z.exe" a -tzip -mx9 -sdel

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Tdate=%%d"
        Set "Xdate=%Tdate:~4,2%-01-%Tdate:~0,4%"
        Set /A Zdate=%Tdate:~0,4%%Tdate:~4,2%
        If %Zdate:~4,2%==01 (Set /A Zdate=%Zdate%-89) Else (Set /A Zdate=%Zdate%-1)

        FOR /F "usebackq delims=" %%d in (`Dir "%BoxIn%" /A:D /B 2^>nul`) DO (
                Call :ArcDir "%BoxIn%" "%%~d" "%Mask%" "%Xdate%" "%Zdate%"
        )
Pause
GoTo :Eof
И далее процедура из предыдущего кода


YuS_2 15-09-2018 21:14 2831509

it3, и это все подробности? м-да...
Ок.
Как часто будет происходить архивация - ежедневно, еженедельно, ежемесячно? Если чаще, чем ежемесячно, то что делать при совпадении имени архива? Что делать с исходными файлами - удалять или оставлять? Есть ли какие-либо подкаталоги или файлы в корневом каталоге, а также в подкаталогах "Folder*", кроме обозначенных *.txt?

Временное решение:
powershell
Код:

function arch-filter {
        process{
                $dname = $_.basename
                if(!(test-path (
                        $a = $_.fullname + $f_bck
                ) -patht container)){md $a|out-null}
                $arr = dir $_.fullname -filt $flt2 -file|%{
                        if($_.lastwritetime.month -le (get-date).addmonths(-1).month){
                                $_.fullname
                        }
                }
                if($arr){
                        compress-archive $arr ($a+'\'+$dname+(
                                '_{0:yyyy-MM-dd_HH-mm}' -f (get-date))+'.zip'
                        )
#если требуется удаление исходных файлов, то раскомментировать следующую строку
                        #del (gi $arr).fullname -force
                } else {
                        write-host "В каталоге $dname файлы для архивирования отсутствуют." -foreg yellow
                }
        }
}

$fld = 'logs' #корневой каталог, лучше указать абсолютный путь
$f_bck = '\bkp' #подкаталог для хранения архивов (обязательный формат со слешем)
$flt1 = 'folder*' #фильтр для отбора каталогов содержащих файлы *.txt
$flt2 = '*.txt' #фильтр для отбора только файлов *.txt

dir $fld -filt $flt1 -dir|arch-filter


it3 17-09-2018 09:00 2831714

Цитата:

Цитата YuS_2
it3, и это все подробности? м-да...
Ок.
Как часто будет происходить архивация - ежедневно, еженедельно, ежемесячно? Если чаще, чем ежемесячно, то что делать при совпадении имени архива? Что делать с исходными файлами - удалять или оставлять? Есть ли какие-либо подкаталоги или файлы в корневом каталоге, а также в подкаталогах "Folder*", кроме обозначенных *.txt? »

Ежемесячно - поэтому совпадений имен не должно быть. Исходные файлы удалять после архивирования. Подкаталог "bkp" есть в каждом каталоге - этот та папка, в которую складываются архивы. Кроме *.txt нет.

Есть каталоги:
W:\LOGS\Любое имя1\
W:\LOGS\Имя любое2\
W:\LOGS\Третье имя3\
W:\LOGS\Разное4\
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...
В них находятся *.txt файлы разного наименования.

Необходимо, чтобы все файлы, кроме тех что созданы в текущем месяце, архивировались и складывались сюда с таким именем:

W:\LOGS\Любое имя1\bkp\Любое имя1_201805.zip
W:\LOGS\Имя любое2\bkp\Имя любое2_201806.zip
W:\LOGS\Третье имя3\bkp\Третье имя3_201807.zip
W:\LOGS\Разное4\bkp\Разное4_201808.zip
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...
... ... ... ... ... ... ... ... ... ... ... ...

megaloman 17-09-2018 09:39 2831716

it3,
Цитата:

Цитата Популярная застольная песТня
В каждой строчке только точки, догадайся, мол, сама!

Дополнил своё решение для обзора всех подпапок указанной папки. Одна строка удалена, одна заменена.

YuS_2 17-09-2018 12:30 2831739

Цитата:

Цитата it3
Ежемесячно - поэтому совпадений имен не должно быть. Исходные файлы удалять после архивирования. Подкаталог "bkp" есть в каждом каталоге - этот та папка, в которую складываются архивы. Кроме *.txt нет. »

Код:

function arch-filter ($swt1,$swt2) {
        process{
                $dname = $_.basename
                if(!(test-path (
                        $a = $_.fullname + $f_bck
                ) -patht container)){md $a|out-null}
                $arr = dir $_.fullname -filt $flt2 -file|%{
                        if($_.lastwritetime.month -le (get-date).addmonths(-1).month){
                                $_.fullname
                        }
                }
                if($arr){
                        $b = $a+'\'+$dname+('_{0:yyyy-MM-dd_HH-mm-ss}' -f (get-date))+'.zip'
                        if (!$swt1){
                                compress-archive $arr $b -force
                                if ($swt2){del (gi $arr).fullname -force}
                        } else {
                                if ($swt2){&$arch a $b $arr -sdel} else {&$arch a $b $arr}
                        }
                } else {
                        write-host "В каталоге $dname файлы для архивирования отсутствуют." -foreg yellow
                }
        }
}
#корневой каталог, лучше указать абсолютный путь:
$fld = 'logs'
#подкаталог для хранения архивов (обязательный формат со слешем):
$f_bck = '\bkp'
#фильтр для отбора каталогов содержащих файлы *.txt:
$flt1 = '*'
#фильтр для отбора только файлов *.txt:
$flt2 = '*.txt'
#путь к файлу внешнего архиватора 7zip
$arch = 'c:\Program Files\7-Zip\7z.exe'

#ключ для выбора вида компрессии: 0 - встроенная упаковка, 1 - внешний архиватор 7zip
$swtch1 = 1
#ключ для выбора удаления исходных файлов: 0 - не удалять, 1 - удалять
$swtch2 = 1

dir $fld -filt $flt1 -dir|arch-filter $swtch1 $swtch2


it3 17-09-2018 12:56 2831743

YuS_2, спасибо.


Время: 17:23.

Время: 17:23.
© OSzone.net 2001-