使用任务计划程序托管包装器创建计划任务,并禁用“跨时区同步”选项

时间:2018-01-21 04:56:57

标签: scheduled-tasks scheduler job-scheduling taskscheduler

是否有人知道如何使用Task Scheduler Managed Wrapper创建计划任务或Schtasks.exe “跨时区同步”取消选中。

Windows Task Scheduler - Task Trigger - Synchronize across time zones

2 个答案:

答案 0 :(得分:0)

可以使用schtasks.exe执行此操作,但这很棘手。实际上,您必须使用/xml开关并传递具有正确格式的触发器的XML文件。

可以通过在开发机器上的任务调度程序GUI中完成所需的配置来确定XML文件的基础知识。然后从上下文菜单中使用 Export ... ,保存文件并删除不相关的位。

给定基本的XML结构:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2018-03-28T18:00:00Z</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Windows\System32\cmd.exe</Command>
      <Arguments>/c dir</Arguments>
    </Exec>
  </Actions>
</Task>

这里的重要元素是<StartBoundary/> - 它定义了任务开始运行的日期/时间和(基于时间的触发器)每天运行的时间,周,等

如果您希望取消选中跨时区同步 您必须使用开始边界的时间值,该时间值是您希望任务运行的本地时间 结束时GMT + 0 / UTC + 0 / zulu-time指标Z

<StartBoundary>2018-03-28T18:00:00</StartBoundary>

以上情况应该每天都在当地时间18:00进行。

如果您想要检查跨时区同步 您必须根据当地时区以及您的时区使用的任何日光节省系统的相应计算所需开始时间的GMT + 0 / UTC + 0 / zulu时间,然后使用此时间值在最后包含Z指标:

<StartBoundary>2018-03-28T18:00:00Z</StartBoundary>

以上情况应该每天18:00 UTC,无论当地时间如何。

注册上述任务: 在命令提示符下,您将发出:

schtasks.exe /create /tn "My Task Name" /xml x:\pathto\taskdefinition.xml

(注册后不需要保留任务定义文件;将设置复制到创建的任务中。)

这里的困难可能在于创建XML文件 - 它可能对文件的编码有点挑剔(您可能需要尝试使用字节顺序标记),并且我从来没有一些设置组合能够正常运行(他们注册正常,但运行任务立即失败,返回代码很奇怪)。您的里程可能会有所不同。

我从未尝试使用Managed Wrapper ,但source建议它也在后台生成XML。但是,它似乎使用XmlDateTimeSerializationMode.RoundtripKind作为序列化方法,(正确地,对于往返)包括时区作为序列化的一部分。

这让我认为它永远不会创建一个任务,其中跨时区同步未经检查。实际上,这可能意味着,如果您可以为开始时间确定正确的时区后缀,则可能不需要自己进行基于Z的计算。

你可以提出一个功能请求,让它根据布尔属性进行更改,例如:

writer.WriteElementString("StartBoundary", 
                          System.Xml.XmlConvert.ToString(t.StartBoundary, 
                          System.Xml.XmlDateTimeSerializationMode.RoundtripKind));

成为:

writer.WriteElementString("StartBoundary", 
                          System.Xml.XmlConvert.ToString(t.StartBoundary, 
                          SynchronizeAcrossTimezones 
                              ? System.Xml.XmlDateTimeSerializationMode.RoundtripKind
                              : System.Xml.XmlDateTimeSerializationMode.Unspecified));

......但这不取决于我!

答案 1 :(得分:0)

通过指定使用Task Scheduler Managed Wrapper库修复它 DateTimeKind.Unspecified in StatBoundary