我有一个每天生成日志文件的 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 ( ) 。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
更多资源
答案2
我认为计算日期总是相当复杂。因此,我想提出一种替代解决方案来实现您的需求。
我将使用另一个计划任务,以 YYYY-MM-DD 格式将当前日期输出到文件中。您可以找到有关如何执行此操作的信息这里。
然后,在负责压缩的计划作业中,您只需读取文件并压缩所有与日期匹配的文件。唯一的问题是您需要提前一天运行第一个任务。例如:
在 23:55 运行任务 1
在 00:05 运行任务 2
听起来很“不智能”,但它确实完成了工作。