Hiris333
19-10-2019, 09:29
Общая цель: в папку D:\backup_\work\source ежедневно архивируются базы 1с
Нужно каждый день запускать скрипт, который будет оставлять в этой папке только файлы за с датой модификации не старше года, из оставшихся должны удаляться все коме тех, которые:
1) имеют дату модификации совпадающую с первым числом каждого месяца.
2) имеют день недели модификации соответветствующий одной из пятниц каждой недели за последние 30 дней.
4) все файлы за последнюю неделю.
Начала ваять такой скрипт и столкнулась с трудностями при передаче значений переменных в циклах for.
Вот что я предлагаю
rem @echo off
Setlocal EnableDelayedExpansion
rem Удаляем файлы старше года
FORFILES.exe /p "D:\backup_\work\source" /M *.* /C "cmd /c del /f /q @file" /d -365
rem Перемещение файлов старше недели в папку "a". В папке source остаются файлы за последнюю неделю
FORFILES.exe /p "D:\backup_\work\source" /M *.* /C "cmd /c move /y @file D:\backup_\work\a" /d -7
rem Перемещение файлов старше месяца из папки "a" в папку "b". В папке "a" остаются файлы старше недели, но с возрастом до 30 дней
FORFILES.exe /p "D:\backup_\work\a" /M *.* /C "cmd /c move /y @file D:\backup_\work\b" /d -30
rem Перемещаем файлы старше недели, но младше месяца созданные в любую пятницу из папки "а" в source, а остальные файлы кидаем в "с"
set dirA=d:\backup_\work\a
for %%D in (%dirA%\*) do (call :calcDayWeek "%%D")
goto :eof
:calcDayWeek
set "sourcePath=%1"
pause
echo %sourcePath%
rem Получение даты модификации файла:
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
set mydate=%%j.%%k.%%l
)
)
echo %mydate%
rem вычисляем день недели модификации этого файла
set /a y=%mydate:~6,4%&
set /a m=1%mydate:~3,2%-100&
set /a d=1%mydate:~0,2%-100
set /a i=(%y%-1901)*365+(%y%-1901)/4+%d%+(!(%y% %% 4))*(!((%m%-3)^&16))
set /a i=(%i%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))%%7+1
echo %i%
if %i%==5 ((move "%sourcePath%" d:\backup_\work\source) & pause) else (move "%sourcePath%" d:\backup_\work\c )
exit /B
В переменную mydate значение даты не передается, как не билась т.е. на этапе получения даты модификации файла \тот скрипт не работает, хотя участки этого кода по отдельности вполне работают - вместе не хотят.
Прошу гуру помочь - что делаю не так? Если честно, то лет шесть уже батники не писала - подзабыла многое.
Нужно каждый день запускать скрипт, который будет оставлять в этой папке только файлы за с датой модификации не старше года, из оставшихся должны удаляться все коме тех, которые:
1) имеют дату модификации совпадающую с первым числом каждого месяца.
2) имеют день недели модификации соответветствующий одной из пятниц каждой недели за последние 30 дней.
4) все файлы за последнюю неделю.
Начала ваять такой скрипт и столкнулась с трудностями при передаче значений переменных в циклах for.
Вот что я предлагаю
rem @echo off
Setlocal EnableDelayedExpansion
rem Удаляем файлы старше года
FORFILES.exe /p "D:\backup_\work\source" /M *.* /C "cmd /c del /f /q @file" /d -365
rem Перемещение файлов старше недели в папку "a". В папке source остаются файлы за последнюю неделю
FORFILES.exe /p "D:\backup_\work\source" /M *.* /C "cmd /c move /y @file D:\backup_\work\a" /d -7
rem Перемещение файлов старше месяца из папки "a" в папку "b". В папке "a" остаются файлы старше недели, но с возрастом до 30 дней
FORFILES.exe /p "D:\backup_\work\a" /M *.* /C "cmd /c move /y @file D:\backup_\work\b" /d -30
rem Перемещаем файлы старше недели, но младше месяца созданные в любую пятницу из папки "а" в source, а остальные файлы кидаем в "с"
set dirA=d:\backup_\work\a
for %%D in (%dirA%\*) do (call :calcDayWeek "%%D")
goto :eof
:calcDayWeek
set "sourcePath=%1"
pause
echo %sourcePath%
rem Получение даты модификации файла:
for %%i in ("%sourcePath%") do (
for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do (
set mydate=%%j.%%k.%%l
)
)
echo %mydate%
rem вычисляем день недели модификации этого файла
set /a y=%mydate:~6,4%&
set /a m=1%mydate:~3,2%-100&
set /a d=1%mydate:~0,2%-100
set /a i=(%y%-1901)*365+(%y%-1901)/4+%d%+(!(%y% %% 4))*(!((%m%-3)^&16))
set /a i=(%i%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))%%7+1
echo %i%
if %i%==5 ((move "%sourcePath%" d:\backup_\work\source) & pause) else (move "%sourcePath%" d:\backup_\work\c )
exit /B
В переменную mydate значение даты не передается, как не билась т.е. на этапе получения даты модификации файла \тот скрипт не работает, хотя участки этого кода по отдельности вполне работают - вместе не хотят.
Прошу гуру помочь - что делаю не так? Если честно, то лет шесть уже батники не писала - подзабыла многое.