我已经准备好了一个我想在启动时运行的Bat文件,但每2天一次。 我怎么能这样做?
答案 0 :(得分:2)
你有没有尝试过什么?只需打开Windows任务计划程序,右键单击您的任务库,选择Create Task...
,设置所需选项,点击Triggers
,点击New
,然后选择Daily
并输入2
中的Recur every: ___ days
。然后将您的bat文件添加到Actions
对话框中的任务中。就是这样。
答案 1 :(得分:1)
MichaelS的解决方案是明智的。 Windows并不总是提供完成任务所需的工具。在这种情况下,你必须自己做一些工作。
一个想法是安排脚本在启动时运行,然后让脚本自己决定它是否“两天”(这个测量有点模棱两可)。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
IF EXIST lastrun.xml (
PowerShell.exe -NoProfile -Command "Exit(([Int64](Get-Date).ToOADate() - (Import-CliXML lastrun.xml)) -ge 2)"
IF "!ERRORLEVEL!"=="0" (
@ECHO Last run less than two days ago.
EXIT /B 0
)
)
@ECHO Last run at least two days ago.
REM do startup stuff
PowerShell.exe -NoProfile -Command "[Int64](Get-Date).ToOADate()|Export-CliXML lastrun.xml"
此脚本使用PowerShell将当前日期保存在文件中,当它超过“自上次运行以来已有两天”检查时。日期转换为64位整数 1 并导出到文件。 2
脚本执行的第一件事是检查自上次运行以来已经过了多长时间。它减去上次运行日期并将其与2进行比较。这样可以使脚本在上次运行后的第二天内随时运行。我只是猜测,但根据你的描述,这听起来像你想要的那样。
您对“每两天运行一次”的定义可能需要更改PowerShell代码以更准确地执行您想要的操作。如果您想要精确的最小秒数或小时数,则可以从使用ToOADate()
切换到导出DateTime对象。当您发现差异时,请使用TimeSpan对象的TotalHours()
或TotalMinutes()
方法之一为您提供自上次运行以来的更精确的数字。
更新(基于问题改进)
此版本的脚本使用PowerShell来确定碎片整理的天数。 如果它在同一日历日运行,则不执行任何操作。如果它是在一天前运行的,请进行清理。如果它在2个或更多日历日之前运行,则再次进行碎片整理(并更新上次碎片整理完成的时间)。 清理完成后,会创建一个标记文件(表示如此)。如果在1天前完成碎片整理并且标记文件已经存在,则不会进行清理。
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "DO_TASK=defrag"
SET "LAST=lastrun.xml"
SET "CLEANUP_MARKER=cleanup.finished"
IF EXIST "%LAST%" (
PowerShell.exe -NoProfile -Command "Exit(([Int64](Get-Date).ToOADate() - (Import-CliXML !LAST!)))"
IF "!ERRORLEVEL!"=="0" (
@ECHO Last defrag was today.
EXIT /B 0
) ELSE IF "!ERRORLEVEL!"=="1" (
@ECHO Last defrag was yesterday.
IF NOT EXIST "%CLEANUP_MARKER%" (
SET "DO_TASK=cleanup"
) ELSE (
@ECHO Cleanup was run today.
EXIT /B
)
) ELSE (
@ECHO Last defrag was at least two days ago.
SET "DO_TASK=defrag"
)
)
IF "%DO_TASK%"=="cleanup" (
REM Cleanup commands
@ECHO CLEANUP
@ECHO.>"%CLEANUP_MARKER%"
) ELSE IF "%DO_TASK%"=="defrag" (
REM Defrag commands
@ECHO DEFRAG
PowerShell.exe -NoProfile -Command "[Int64](Get-Date).ToOADate()|Export-CliXML !LAST!"
DEL /Q "%CLEANUP_MARKER%"
)
1 自1900年1月1日以来的天数,我想
2 对于整数来说,这可能有点过分,但我最初编写的脚本用于处理DateTime对象 - 根据您对“两天”的定义,可能需要使用 - 并且Export-CliXml可以同时使用。