Classified, к сожалению у 7-zip я не нашёл такой замечательной возможности (отбор файлов по дате).
У меня для такой достаточно простой задачи (типа удаления старых логов) больше лежит душа к использованию BAT.
Просто сам код лаконичнее получается, чем было бы на VBS: не нужно возиться с объектами FileSystemObject, File, TextStream и т.п.
Если всё же есть необходимость реализовать это именно в VBS/JS и не устраивает "костыль" описанный ниже - то можно и на VBS это изобразить.
Но будет не 15 строк, а в 2-3 раза больше.
Основная проблема с BAT - это сравнение дат.
В примере ниже используются процедуры от dostips.com для определения у даты файла юлианского номера дня.
Соответственно, мы сегодня архивируем файлы не точно с суточной разницей в датах, а просто вчерашние и более поздние - время не участвует в сравнении, только сама дата.
@echo off & title %~nx0 & SetLocal EnableExtensions EnableDelayedExpansion
rem Папка логов:
set "sDirLog=C:\LOG"
rem Папка архивов, можно заменить "C:\LOG\ARH" на "\\nas\*\наименование папки":
set "sDirArh=C:\LOG\ARH"
md "!sDirArh!" >nul 2>&1
rem Маска LOG-файлов:
set "sMaskLog=*.log"
rem Временный файл, будет содержать список архивируемых .log-файлов.
set "sFileTmp=%TEMP%\%~n0_%RANDOM%.tmp"
rem nNow = сегодняшняя дата.
call :jDate nNow
rem Файл-архива, в имени содержится текущая дата:
call :jdate2date !nNow! nYYYY nMM nDD
set "sFileArh=!sDirArh!\#!nYYYY!!nMM!!nDD!.7z"
rem Заполнение списка по условию: дата создания файла меньше сегодняшней (nFile < nNow).
for %%a in ("!sDirLog!\!sMaskLog!") do (
call :fTime nFile "%%~a"
if !nFile! lss !nNow! echo.%%~a>>"!sFileTmp!"
)
if exist "!sFileTmp!" (
rem -scsDOS задаёт кодировку DOS для списка файлов sFileTmp (чтобы не было проблем с кириллицей, по ум. у 7z: UTF-8)
rem -sdel удаляет архивированные файлы
call "7z.exe" a "!sFileArh!" "@!sFileTmp!" -scsDOS -sdel
del /q "!sFileTmp!" >nul 2>&1
echo.
if exist "!sFileArh!" echo.Создан архив: "!sFileArh!"
) else (
echo.*** Нет подходящих файлов для архивирования!
)
pause
Endlocal
exit /b
rem ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ftime JD filename attr -- returns the file time in julian days
:: -- JD [out] - valref file time in julian days
:: -- attr [in,opt] - time field to be used, creation/last-access/last-write, see 'dir /?', i.e. /tc, /ta, /tw, default is /tw
:$created 20060101 :$changed 20090322 :$categories DateAndTime
:$source http://www.dostips.com
SETLOCAL
set file=%~2
set attr=%~3
if not defined attr (call:jdate JD "- %~t2"
) ELSE (for /f %%a in ('"dir %attr% /-c "%file%"|findstr "^^[0-9]""') do call:jdate JD "%%a")
ENDLOCAL & IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
EXIT /b
:jdate JD DateStr -- converts a date string to julian day number with respect to regional date format
:: -- JD [out,opt] - julian days
:: -- DateStr [in,opt] - date string, e.g. "03/31/2006" or "Fri 03/31/2006" or "31.3.2006"
:$reference http://groups.google.com/group/alt.msdos.batch.nt/browse_frm/thread/a0c34d593e782e94/50ed3430b6446af8#50ed3430b6446af8
:$created 20060101 :$changed 20080219
:$source http://www.dostips.com
SETLOCAL
set DateStr=%~2&if "%~2"=="" set DateStr=%date%
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
for /f "tokens=1-3 delims=/.- " %%A in ("%DateStr:* =%") do (
set %%a=%%A&set %%b=%%B&set %%c=%%C))
rem { дд-мм-гг или dd-mm-yy в выводе "echo.|date"
if /i "%гг%" == "" (
set /a "yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100"
) else (
set /a "yy=10000%гг% %%10000,mm=100%мм% %% 100,dd=100%дд% %% 100"
)
rem }
set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4
ENDLOCAL & IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
EXIT /b
:jdate2date JD YYYY MM DD -- converts julian days to gregorian date format
:: -- JD [in] - julian days
:: -- YYYY [out] - gregorian year, i.e. 2006
:: -- MM [out] - gregorian month, i.e. 12 for december
:: -- DD [out] - gregorian day, i.e. 31
:$reference http://aa.usno.navy.mil/faq/docs/JD_Formula.html
:$created 20060101 :$changed 20080219 :$categories DateAndTime
:$source http://www.dostips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set /a L= %~1+68569, N= 4*L/146097, L= L-(146097*N+3)/4, I= 4000*(L+1)/1461001
set /a L= L-1461*I/4+31, J= 80*L/2447, K= L-2447*J/80, L= J/11
set /a J= J+2-12*L, I= 100*(N-49)+I+L
set /a YYYY= I, MM=100+J, DD=100+K
set MM=%MM:~-2%
set DD=%DD:~-2%
( ENDLOCAL & REM RETURN VALUES
IF "%~2" NEQ "" (SET %~2=%YYYY%) ELSE echo.%YYYY%
IF "%~3" NEQ "" (SET %~3=%MM%) ELSE echo.%MM%
IF "%~4" NEQ "" (SET %~4=%DD%) ELSE echo.%DD%
)
EXIT /b