about_Scheduled_Jobs

简短说明

介绍计划作业并说明如何在 PowerShell 和任务计划程序中使用和管理计划作业。

长说明

PowerShell 计划作业是 PowerShell 后台作业和任务计划程序任务的有用结合。

与 PowerShell 后台作业一样,计划作业以异步方式在后台运行。 可以使用作业 cmdlet(如 Start-JobGet-JobStop-JobReceive-Job)管理已运行的计划作业实例。

与任务计划程序任务一样,计划作业也保存到磁盘。 你可以在任务计划程序中查看和管理作业、根据需要启用和禁用它们、运行它们或将它们用作模板、制定一次性计划或重复计划来启动作业,或者设置作业启动条件。

此外,计划作业实例的结果以易于访问的格式保存到磁盘,提供作业输出的运行日志。 计划作业附带一组用于管理它们的自定义 cmdlet。 这些 cmdlet 使你能够创建、编辑、管理、禁用和重新启用计划作业、作业触发器和作业选项。

这套全面且灵活的工具使计划作业成为许多专业 PowerShell IT 解决方案的重要组成部分。

计划作业 cmdlet 包含在随 PowerShell 一起安装的 PSScheduledJob 模块中。 该模块是在 PowerShell 3.0 中引入的,适用于 PowerShell 3.0 及更高版本的 PowerShell。 有关 PSScheduledJob 模块中包含的 cmdlet 的详细信息,请参阅 PSScheduledJob

有关 PowerShell 后台作业的详细信息,请参阅 about_Jobs

有关任务计划程序的详细信息,请参阅任务计划程序

注意

可以在任务计划程序中查看和管理 PowerShell 计划作业。 PowerShell 作业和计划作业 cmdlet 仅适用于在 PowerShell 中创建的计划作业。

快速入门

此示例创建一个计划作业,该作业每天凌晨 3:00 启动,然后运行 Get-Process cmdlet。 即使计算机使用电池运行,作业也会启动。

$trigger = New-JobTrigger -Daily -At 3AM
$options = New-ScheduledJobOption -StartIfOnBattery
Register-ScheduledJob -Name ProcessJob -ScriptBlock {Get-Process} `
-Trigger $trigger -ScheduledJobOption $options

Get-ScheduledJob cmdlet 获取本地计算机上的计划作业。

Get-ScheduledJob
Id         Name            Triggers        Command            Enabled
--         ----            --------        -------            -------
7          ProcessJob      {1}             Get-Process        True

Get-JobTrigger 获取 ProcessJob 的作业触发器。 输入参数指定计划作业,而不指定触发器,因为触发器保存在计划作业中。

Get-JobTrigger -Name ProcessJob
Id         Frequency       Time                   DaysOfWeek        Enabled
--         ---------       ----                   ----------        -------
1          Daily           11/5/2011 3:00:00 AM                     True

此示例使用 Set-ScheduledJob cmdlet 的 ContinueIfGoingOnBattery 参数将 ProcessJob 的 StopIfGoingOnBatteries 属性更改为 False

Get-ScheduledJob -Name ProcessJob | Set-ScheduledJobOption `
-ContinueIfGoingOnBattery -PassThru
StartIfOnBatteries     : True
StopIfGoingOnBatteries : False
WakeToRun              : True
StartIfNotIdle         : True
StopIfGoingOffIdle     : False
RestartOnIdleResume    : False
IdleDuration           : 00:10:00
IdleTimeout            : 01:00:00
ShowInTaskScheduler    : True
RunElevated            : False
RunWithoutNetwork      : True
DoNotAllowDemandStart  : False
MultipleInstancePolicy : IgnoreNew
JobDefinition          : Microsoft.PowerShell.ScheduledJob.ScheduledJobDefinition

Get-ScheduledJob cmdlet 获取 ProcessJob 计划作业。

Get-ScheduledJob ProcessJob
Id         Name            Triggers        Command        Enabled
--         ----            --------        -------        -------
7          ProcessJob      {1}             Get-Process    True

Get-Job cmdlet 获取迄今为止已运行的 ProcessJob 计划作业的所有实例。 只有在 PSScheduledJob 模块已导入到当前会话中后,Get-Job cmdlet 才会获取计划作业。

提示

请注意,你使用计划作业 cmdlet 来管理计划作业,但也使用作业 cmdlet 来管理计划作业的实例。

Get-Job -Name ProcessJob
Id     Name        PSJobTypeName  State    HasMoreData   Location   Command
--     ----        ------------   -----    -----------   --------   -------
45     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
46     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
47     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
48     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
49     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
50     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process
51     ProcessJob  PSScheduledJob Completed       True   localhost   Get-Process

Receive-Job cmdlet 获取 ProcessJob 计划作业 (ID = 51) 的最新实例的结果。

Receive-Job -ID 51

即使 Receive-Job 命令不包含 Keep 参数,作业结果也会保存到磁盘上,直到你删除它们或者结果数超出最大数量限制。

作业结果在此会话中不再可用,但如果你启动新会话或打开新的 PowerShell 窗口,作业结果将再次可用。

以下命令使用 Start-Job cmdlet 的 DefinitionName 参数来启动 ProcessJob 计划作业。

使用 Start-Job cmdlet 启动的作业是标准 PowerShell 后台作业,而不是计划作业的实例。 与所有后台作业一样,这些作业会立即启动,不受作业选项的约束,也不受作业触发器的影响,其输出不会保存在计划作业目录的输出目录中。

Start-Job -DefinitionName ProcessJob

Unregister-ScheduledJob cmdlet 会删除 ProcessJob 计划作业以及其作业实例的所有已保存结果。

Unregister-ScheduledJob ProcessJob

计划作业概念

计划作业会运行命令或脚本。 计划作业可以包括启动作业的作业触发器和设置运行作业的条件的作业选项。

作业触发器会自动启动计划作业。 作业触发器可以包括一次性计划或重复计划,也可以指定一个事件,例如在用户登录时或 Windows 启动时启动作业。 一项计划作业可以有一个或多个作业触发器。你可以创建、添加、启用、禁用和获取作业触发器。

作业触发器是可选的。 可以使用 Start-Job cmdlet 来立即启动计划作业,也可以通过将 RunNow 参数添加到 Register-ScheduledJob 命令中来这样做。

作业选项设置运行计划作业的条件。 每个计划作业都有一个作业选项对象。 可以创建和编辑作业选项对象并将其添加到一项或多项计划作业。

每次计划作业启动时,都会创建一个作业实例。 使用 PowerShell 作业 cmdlet 查看和管理作业实例。

计划作业将保存到磁盘并使用 cmdlet 谓词 Register,而不使用 New。 XML 文件位于本地计算机上的目录 $HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs 中。

PowerShell 为每个计划作业创建一个目录,并将作业命令、作业触发器、作业选项和作业结果保存在计划作业目录中。 作业触发器和作业选项不会独立保存到磁盘。 它们保存在关联的每个计划作业的计划作业 XML 中。

计划作业、作业触发器和作业选项在 PowerShell 中显示为对象。 这些对象是相互链接的,因此可以很容易地在命令和脚本中发现和使用它们。

计划作业显示为 ScheduledJobDefinition 对象。 ScheduledJobDefinition 对象有一个包含计划作业的作业触发器的 JobTriggers 属性和一个包含作业选项的 Options 属性。 分别表示作业触发器和作业选项的 ScheduledJobTriggers 和 ScheduledJobOptions 对象各自有一个 JobDefinition 属性,其中包含关联的计划作业。 有了这种递归互连,就可以很容易地查找计划作业的触发器和选项,以及查找、显示与任何作业触发器或作业选项关联的计划作业和为其编写脚本。

另请参阅