![]() |
Не работает BAT файл - прошу помощи
Общая цель: в папку 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 значение даты не передается, как не билась т.е. на этапе получения даты модификации файла \тот скрипт не работает, хотя участки этого кода по отдельности вполне работают - вместе не хотят. Прошу гуру помочь - что делаю не так? Если честно, то лет шесть уже батники не писала - подзабыла многое. |
Hiris333, работа с датами — не самая сильная сторона пакетных файлов. Рекомендую пользовать WSH/PowerShell.
Цитата:
Код:
for %%D in ("%dirA%\*.*") do (call :calcDayWeek "%%~D") |
Спасибо! Помогло. Да действительно, имена файлов с пробелами. После ввода тильды - все пошло. :-)
Я поняла тильда здесь нужна чтобы потом кавычки отменялись... С WSH/PowerShell пока дело не имела - надо копнуть как-нибудь. Я старой закалки. Еще с ПК на дискетах игралась... |
Hiris333, Вот вариант:
Переформулирую постановку. Надо оставить файлы:
1. Все за последние 7 дней 2. Все пятничные файлы за последние 30 дней 3. Все файлы с первым числом месяца за последние 365 дней Код:
@Echo Off |
Цитата:
Цитата:
Код:
$folder = 'D:\backup_\work\source' |
Абалдеть!!! Готовые решения...
Вы меня балуете :))) Спасибо!!! Изящно! Про Powershell тоже спасибо!!! Поучительно! Буду разбираться. |
Время: 23:26. |
Время: 23:26.
© OSzone.net 2001-