关于计划作业

简短说明

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

长说明

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

与 PowerShell 后台作业一样,计划的作业在后台异步运行。 可以使用作业 cmdlet(如 、、Get-JobStop-Job、 和 Receive-JobStart-Job管理已运行的计划作业的实例。

与任务计划程序任务一样,计划的作业将保存到磁盘。 可以在任务计划程序中查看和管理作业、根据需要启用和禁用作业、运行作业或将其用作模板、建立启动作业的一次性或定期计划,或设置启动作业的条件。

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

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

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

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

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

注意

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

快速入门

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

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

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

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

此示例使用 cmdlet 的 Set-ScheduledJobContinueIfGoingOnBattery 参数将 ProcessJobStopIfGoingOnBatteries 属性更改为 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

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

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

cmdlet Get-Job 获取到目前为止已运行的 ProcessJob 计划作业的所有实例。 Get-Job仅当 PSScheduledJob 模块导入当前会话时,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

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

Receive-Job -ID 51

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

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

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

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

Start-Job -DefinitionName ProcessJob

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

Unregister-ScheduledJob ProcessJob

计划作业概念

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

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

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

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

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

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

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

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

计划的作业显示为 ScheduledJobDefinition 对象。 ScheduledJobDefinition 对象具有一个 JobTriggers 属性,该属性包含计划作业的作业触发器,以及一个包含作业选项的 Options 属性。 分别表示作业触发器和作业选项的 ScheduledJobTriggersScheduledJobOptions 对象都有一个 JobDefinition 属性,其中包含与其关联的计划作业。 通过这种递归互连,可以轻松查找计划作业的触发器和选项,以及查找、编写脚本并显示与任何作业触发器或作业选项关联的计划作业。

另请参阅

about_Scheduled_Jobs_Basics

about_Scheduled_Jobs_Advanced

about_Scheduled_Jobs_Troubleshooting

任务计划程序