Войти

Показать полную графическую версию : [решено] backup файлов прошлого месяца


it3
13-09-2018, 15:24
Добрый день!
Есть необходимость написать 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
Как понимать, файлы, изменённые/созданные только в прошлом месяце? Изменённые в другом месяце не рассматриваем? »Прошу прощения. Все файлы, кроме файлов текущего месяца.

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

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

YuS_2
15-09-2018, 13:48
Подсобите пожалуйста. »
Для того, чтобы подсобить, необходимо сначала определиться в чём.
Опишите подробнее условия и что именно требуется.
Архивируются все файлы или определенного типа, или целиком каталог с подкаталогами? и т.д., и т.п.

it3
15-09-2018, 14:37
Для того, чтобы подсобить, необходимо сначала определиться в чём.
Опишите подробнее условия и что именно требуется.
Архивируются все файлы или определенного типа, или целиком каталог с подкаталогами? и т.д., и т.п. »
Есть каталоги:
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
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
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
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
it3, В каждой строчке только точки, догадайся, мол, сама!Дополнил своё решение для обзора всех подпапок указанной папки. Одна строка удалена, одна заменена.

YuS_2
17-09-2018, 12:30
Ежемесячно - поэтому совпадений имен не должно быть. Исходные файлы удалять после архивирования. Подкаталог "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
YuS_2, спасибо.




© OSzone.net 2001-2012