如何在任务计划程序中安排任务,每2天启动一次?

时间:2014-11-12 12:49:37

标签: windows batch-file windows-7 scheduled-tasks

我已经准备好了一个我想在启动时运行的Bat文件,但每2天一次。 我怎么能这样做?

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可以同时使用。