当前位置: 首页 > 知识库问答 >
问题:

PowerShell查询Windows任务计划程序以查找将在特定日期时间之间运行的任务

宰父君昊
2023-03-14

我继承了一台服务器,它为数百个不同的进程运行Windows计划任务(主要是启动自定义PowerShell脚本)-这些任务的计划可以是每15分钟一次,也可以是每年在特定日期一次。

如何使用PowerShell(或其他任何方式)查询任务调度程序,以确定将来是否有任何任务在特定日期-时间范围内运行?这是必要的,因此我们可以例如对这台服务器以及与之交互的其他服务器进行调度和执行维护。

共有2个答案

谭彦
2023-03-14

下面是用于获取下一个正在运行的作业的脚本

Get-ScheduledTask |
   Foreach-object { Get-ScheduledTaskInfo $_} |
   where-object {!($_.NextRunTime -eq $null)} |
   Select-object Taskname, NextRunTime |
   Sort-object -property NextRunTime
戚侯林
2023-03-14

我应该首先提到这是一个看似复杂的话题。这有几个原因,包括但不限于:

  1. 作为对象的调度任务可能非常复杂,具有广泛可变的调度、重复间隔、其他触发器类型和大量其他配置
  2. 非GUI(即CLI、cmdlet和/或API工具)多年来发生了变化。而且,将它们串在一起解决第1点中提到的复杂性并不总是容易的

警告:这份报告将很难写。在开始这样的挑战之前,您应该寻找任何预先存在的工具,这些工具可能会清点任务计划程序或为任务计划程序提供其他透明度。

此外,最好将维护窗口定义为政策问题。然后,您可以配置作业以避免该窗口。乍一看,我觉得这比编写一个困难的程序来帮助挑选时间段要容易得多。

如果您选择继续前进,这里有一些工具可能会有所帮助:

    < li>Schtasks.exe:一个已经存在很长时间的功能惊人的CLI工具。 < Li > task scheduler PowerShell模块:围绕计划COM对象编写的PowerShell模块。它最初是Windows 7 PowerShell包的一部分,但现在你可以通过PowerShell Gallery获得它。最简单的方法是通过典型的模块cmdlets,如< code>Find-Module

注意:很容易混淆后两种工具。不仅名称非常相似,而且它们包含的命令之间也有重叠和相似之处。例如,两个模块都有一个< code > Get-scheduled task cmdlet。处理困惑的两种方法:

  1. 使用<code>Import Module
  2. 使用限定名称调用cmdlet,如TaskScheduler\GetScheduledTasks

现在来看看日程安排数据。根据我的经验,所需的细节只能通过任务的XML定义公开。同样,您将遇到各种调度和/或触发选项带来的复杂性。您可以在这里阅读XML模式

以下是有关如何访问 XML 数据的一些示例:

schtasks.exe /query /s pyexadm1 /tn <TaskName> /XML

在这种情况下,您必须执行额外的字符串操作来隔离XML,然后将其转换为[XML],以便以典型的PowerShell方式使用它。显然,更广泛地利用这一工具将面临挑战。然而,知道如何快速检查和工作非常方便,特别是在下一个工具不立即可用的情况下。

注意:如果您不引用/TN参数,所有任务都将被返回。虽然下一个方法更容易,但很高兴知道这种方法,它会在您开发时很方便。

下一个示例使用较旧的任务调度程序模块(上面的 #2):

$TaskXML = [XML](TaskScheduler\Get-ScheduledTask -ComputerName <ComputerName>-Name <TaskName>).XML

注意:以上假设未使用前缀。因此,您必须引用源模块以防止与计划任务模块混淆。

本示例加载XML文本并将其转换为一行中的XmlDocument对象。然后,您可以访问有关任务的数据,如下所示:

$TaskXML.Task.Triggers.CalendarTrigger

这可能会产生如下输出:

StartBoundary       Enabled ScheduleByWeek
-------------       ------- --------------
2020-09-14T08:00:00 true    ScheduleByWeek

您可以通过利用管道来批量运行此管道,该管道可能如下所示:

$XMLTaskData = 
TaskScheduler\Get-ScheduledTask -ComputerName <ComputerName> -Recurse | 
ForEach-Object{ [XML]$_.XML }

在上面的管道示例中,产生的< code>$XMLTaskData是一个数组,其中的每个元素都是一个相应的XML任务定义。

注: 使用 -递归开关参数。鉴于任务数量众多,如果将它们组织到子文件夹中,我不会感到惊讶。

同样,您也可以使用“计划任务”模块中的“导出计划任务”cmdlet:

$TaskXML = [XML](Export-ScheduledTask -CimSession <ComputerName> -TaskName <TaskName>)

您可以像这样利用管道:

$XMLTaskData = 
Get-ScheduledTask -CimSession <ComputerName> | 
Export-ScheduledTask | 
ForEach-Object{ [XML]$_ }

与其他管道示例一样,这将生成一个 XML 任务定义数组。

注意:在这种情况下,没有-Recurse参数。不过,您可以专门引用路径。

使用这些方法中的任何一种,您显然需要熟悉在PowerShell中使用XML对象,但有大量的教程或其他资源。

同样,这里的复杂性在于处理许多触发类型和调度范例。在您获得最小可行程序(MVP)的道路上,您可能想要使用这些技术来清点现有的任务。这可以帮助你优先考虑你的发展过程。

最后一点;知道任务何时运行可能与知道它何时运行完全不同。例如,一个任务可能在下午1点运行,但作业的持续时间是可变的且不可计算的。我觉得这很难对付。您可能需要另一个过程在事件日志中查找任务完成事件。您可能还需要考虑XML数据中的执行时间限制。

 类似资料:
  • 我在context.xml文件中定义了一个Spring调度任务,它每分钟运行一次。该任务调用postgres存储过程。存储过程运行时可以持续一分钟以上。如果当前运行没有完成,spring框架会调用相同的调度程序吗?谢谢,

  • 本文向大家介绍如何使用PowerShell启动任务计划程序的特定任务?,包括了如何使用PowerShell启动任务计划程序的特定任务?的使用技巧和注意事项,需要的朋友参考一下 要使用PowerShell启动任务计划程序的特定任务,我们需要使用Start-ScheduledTask 命令。 当我们运行上面的命令时,我们需要提供任务名称。 例如, 当您检查以上任务状态时, 示例 输出: 要在远程计算机

  • 我试图让一个任务在Windows调度程序运行每10分钟。 下图中有两条蓝线,这只是一个任务,但我在刷新页面后的不同时间截图了它们。 正如您可以在图像任务调度器中看到的,在最后运行时间下的底部蓝线上显示为下午3:37,下一个运行时间为下午5:02。然后在顶部蓝线上,我在下午5:02之后有一个相同任务的屏幕截图,它没有更新上一次运行时间,但它将下一次运行时间向前推了10分钟。 如果我右键单击任务并手动

  • 我有一些可执行文件要安排在Windows任务调度程序中运行。他们的输出必须在某处看到。通过Windows任务计划程序运行应用程序时,程序的输出将丢失。如何捕获此输出?我做了谷歌搜索,找到了破解方法,改为运行cmd并将输出重定向到日志文件,但我无法将这些信息很好地保存在XML文件中,我应该能够在任务调度程序中注册,因此我需要一种更好的方法。 任何帮助都将不胜感激。

  • 我以前有许多 C .exe程序(使用 C Builder XE7 开发)作为计划任务在 Windows 2008 R2 数据中心服务器中运行。这些任务由SYSTEM帐户运行,我以前从未遇到过任何问题。 我最近将这些任务导入到新的Windows 2019数据中心服务器,并在任务计划程序中设置这些任务。使用相同的系统帐户运行任务,但是使用更新的Windows服务器,这些任务现在给我的运行结果是0xC0

  • 我们要求每个月1日(时间: 00:00:00 AM)准确地运行一个作业。 我们使用Spring框架的计划时间任务来使用延迟和周期属性来计划作业。此类不支持在特定日期运行作业。 有人能建议我们如何使用Spring和Java技术解决这个问题吗?