7zip - 使用 Windows 任务计划程序压缩具有前一天时间戳的文件

7zip - 使用 Windows 任务计划程序压缩具有前一天时间戳的文件

我有一个每天生成日志文件的 Web 服务器,当天的日志将自动保存为Log.YYYY-MM-DD.txt(即日志.2016-07-20.txt)。

现在我需要使用Windows 任务计划程序要压缩前一天日志文件,7zip cmd 中是否有可用的选项可以根据当前日期自动识别文件名?

答案1

批处理脚本 - 简化从当前日期减去(或添加)天数

您可以使用批处理脚本来执行此操作,该脚本设置日期变量并从执行批处理脚本的当前日期中减去 1 天(或任意天数)。因此,您需要确保计划执行脚本的日期是您期望进行计算的日期,以确定前一天日志文件名中的日期值。

我在脚本中添加了更多注释来解释每个变量的作用等等,但基本上您像往常一样在批处理脚本中设置变量,它将使用这些变量构建三个动态 VB 脚本来执行日期减法计算,在需要的地方添加前导零,等等,对于 YYYY、MM 和 DD 变量。

加上:您还可以使用此脚本通过删除减号来将天数添加到当前日期- 以下批处理脚本中的符号:DynamicVBSScriptBuild例行公事,因此当您看到这个时,您只需删除每一行上的,-%MinusDay%,减号,现在变量值将等于您要添加的天数。,%MinusDay%,MinusDay=

重要的提示:99999似乎批处理脚本在减去该值时的限制是五个 9 ( )。似乎批处理脚本在添加该值时的限制是MinusDays=六个 9 ( ) 。999999MinusDays=

批处理脚本

@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

更多资源

答案2

我认为计算日期总是相当复杂。因此,我想提出一种替代解决方案来实现您的需求。

我将使用另一个计划任务,以 YYYY-MM-DD 格式将当前日期输出到文件中。您可以找到有关如何执行此操作的信息这里

然后,在负责压缩的计划作业中,您只需读取文件并压缩所有与日期匹配的文件。唯一的问题是您需要提前一天运行第一个任务。例如:

在 23:55 运行任务 1

在 00:05 运行任务 2

听起来很“不智能”,但它确实完成了工作。

相关内容