3

У меня есть веб-сервер, который генерирует файлы журнала каждый день, журнал дня будет автоматически сохранен как Log.YYYY-MM-DD.txt (т. Е. Log.2016-07-20.txt).

Теперь мне нужно использовать планировщик заданий Windows, чтобы сжать файл журнала за предыдущий день. Есть ли в 7zip cmd опция, которая бы автоматически определяла имя файла на основе текущей даты?

2 ответа2

3

Пакетный скрипт - вычитание (или добавление) дней из упрощенного текущего дня

Это можно сделать с помощью пакетного сценария, который устанавливает переменную даты и вычитает 1 день (или любое количество дней в этом отношении) из текущей даты, в которой выполняется пакетный сценарий. Поэтому вам необходимо убедиться, что на день, на который вы запланировали выполнение сценария, вы ожидаете, что в этот день будут произведены вычисления для определения значений дат в имени файла журнала за предыдущий день.

Я добавил больше комментариев в сценарий, чтобы объяснить, что делает каждая переменная и так далее, но в основном вы устанавливаете переменные в пакетном сценарии как обычно, и они будут использоваться для построения трех динамических VB-сценариев для вычисления вычитания даты, при необходимости добавьте начальные нули и т. д. для переменных YYYY, MM и DD.

Чтобы добавить: Вы также можете использовать этот сценарий для добавления количества дней к текущей дате, удалив символ минус (-) из приведенного ниже пакетного сценария в процедуре :DynamicVBSScriptBuild , поэтому, где вы видите это ,-%MinusDay%, вы просто удалите символ минус, чтобы получить ,%MinusDay%, в каждой из этих строк, и теперь значение переменной MinusDay= будет равно числу дней, которое вы хотите добавить.

Важное примечание: кажется, что пять 9 (99999) - это предел для пакетного сценария при вычитании со значением MinusDays= . Также кажется, что шесть 9 (999999) - это предел для пакетного сценария при добавлении со значением MinusDays= .

Пакетный скрипт

@ECHO ON

::// Minus days is the number of days to subtract from the CURRENT DAY i.e. 2 for minus 2 days or 99999 for minus 99999 days from when it's run
SET MinusDay=2

::// Set the archive file full path and file name
SET ArchiveFile=C:\ArchivePath\Archive.zip

:: This calls the temp vbs script routine that will be used to set YYYY-MM-DD values for the subtracted days date you specify
CALL :DynamicVBSScriptBuild

FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%YYYYTmpVBS%"') DO SET YYYY=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%MMTmpVBS%"') DO SET MM=%%A
FOR /F "TOKENS=*" %%A IN ('cscript//nologo "%DDTmpVBS%"') DO SET DD=%%A

::// Set your web server log file path in the below variable
SET WebServerLogPath=C:\WebServer\Logs

::// Set web server log file name where YYYY MM DD variables are set to the values after the day numbers setup above are subtracted
SET WebServerLogFile=Log.%YYYY%-%MM%-%DD%.txt

::CD /D "C:\Program Files\7-Zip"
7z a "%ArchiveFile%" "%WebServerLogPath%\%WebServerLogFile%"

::GOTO EOF
EXIT /B

:DynamicVBSScriptBuild
SET YYYYTmpVBS=%temp%\~tmp_yyyy.vbs
SET MMTmpVBS=%temp%\~tmp_mm.vbs
SET DDTmpVBS=%temp%\~tmp_dd.vbs
IF EXIST "%YYYYTmpVBS%" DEL /Q /F "%YYYYTmpVBS%"
IF EXIST "%MMTmpVBS%" DEL /Q /F "%MMTmpVBS%"
IF EXIST "%DDTmpVBS%" DEL /Q /F "%DDTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%YYYYTmpVBS%"
ECHO yyyy = Year(dt)                    >> "%YYYYTmpVBS%"
ECHO WScript.Echo yyyy                  >> "%YYYYTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%MMTmpVBS%"
ECHO mm = Right("0" ^& Month(dt),2)     >> "%MMTmpVBS%"
ECHO WScript.Echo mm                    >> "%MMTmpVBS%"
ECHO dt = DateAdd("d",-%MinusDay%,date) >> "%DDTmpVBS%"
ECHO dd = Right("0" ^& Day(dt),2)       >> "%DDTmpVBS%"
ECHO WScript.Echo dd                    >> "%DDTmpVBS%"
GOTO EOF

Дополнительные ресурсы

1

Я думаю, что всегда довольно сложно вычислить даты. Поэтому я хотел бы предложить альтернативное решение для достижения того, что вам нужно.

Я бы использовал другое запланированное задание, чтобы вывести текущую дату в формате YYYY-MM-DD в файл. Вы можете найти информацию о том, как это сделать, здесь.

Затем в своей запланированной работе, которая отвечает за архивирование, вы просто читаете файл и архивируете все файлы, которые соответствуют дате. Единственная проблема заключается в том, что вам нужно будет выполнить первое задание на день раньше. Подобно:

Выполнить задание 1 в 23:55

Выполнить задание 2 в 00:05

Звучит очень "неразумно", но это делает работу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .