关于计划作业基础知识

简短说明

说明如何创建和管理计划作业。

长说明

本文档演示如何执行创建和管理计划作业的基本任务。 有关更多高级任务的信息,请参阅 about_Scheduled_Jobs_Advanced

如何创建计划作业

若要创建计划作业,请使用 Register-ScheduledJob cmdlet。 cmdlet 需要名称以及作业运行的命令或脚本。 可以通过添加 RunNow 参数立即运行作业,也可以在创建作业时创建作业触发器并设置作业选项,也可以编辑现有作业。

若要创建运行脚本的作业,请使用 FilePath 参数指定脚本文件的路径。 若要创建运行命令的作业,请使用 ScriptBlock 参数。

cmdlet Register-ScheduledJob 创建 ProcessJob,用于运行 Get-Process 命令。 此计划作业具有默认作业选项,并且没有作业触发器。

Register-ScheduledJob -Name ProcessJob -ScriptBlock { Get-Process }
Id         Name            Triggers        Command       Enabled
--         ----            --------        -------       -------
8          ProcessJob      {}              Get-Process   True

如何创建作业触发器

作业触发器会自动启动计划的作业。 作业触发器可以是一次性或定期计划或事件,例如用户登录或 Windows 启动时。 每个作业可以有零个、一个或多个作业触发器。

若要创建作业触发器,请使用 New-JobTrigger cmdlet。 以下命令创建一个作业触发器,该触发器在每个星期一和星期四的凌晨 5:00 启动一个作业。 命令将作业触发器保存在 变量中 $T

$T = New-JobTrigger -Weekly -DaysOfWeek "Monday", "Thursday" -At "5:00 AM"

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

如何添加作业触发器

将作业触发器添加到计划作业时,作业触发器将添加到计划作业的计划作业 XML 文件中,并成为计划作业的一部分。

可以在创建计划作业时将作业触发器添加到计划作业,也可以编辑现有作业。 可以随时更改计划作业的作业触发器。

PowerShell 使用一些与任务计划程序相同的作业触发器。 有关作业触发器的详细信息,请参阅 New-JobTrigger cmdlet 的帮助主题。

以下示例使用 splatting 来创建 $JobParms 传递给 Register-ScheduledJob cmdlet 的参数值。 有关详细信息,请参阅 about_Splatting.md。 使用 Register-ScheduledJob@JobParms 创建计划作业。 它使用 Trigger 参数在变量中 $T 指定作业触发器。

$JobParms = @{
  Name = "ProcessJob"
  ScriptBlock = {Get-Command}
  Trigger = $T
}

Register-ScheduledJob @JobParms

还可以随时将作业触发器添加到现有的计划作业。 cmdlet Add-JobTrigger 将变量中的 $T 作业触发器添加到 ProcessJob 计划作业。

Add-JobTrigger -Name ProcessJob -Trigger $T

因此,作业触发器在每个星期一和星期四的凌晨 5:00 自动启动 ProcessJob

如何获取作业触发器

若要获取计划作业的作业触发器,请使用 Get-JobTrigger cmdlet。 使用 NameIDInputObject 参数指定计划的作业,而不是作业触发器。

Get-JobTrigger 获取 ProcessJob 的作业触发器。

Get-JobTrigger -Name ProcessJob
Id   Frequency       Time                   DaysOfWeek              Enabled
--   ---------       ----                   ----------              -------
1    Weekly          11/7/2011 5:00:00 AM   {Monday, Thursday}      True

如何创建作业选项

作业选项为启动和运行作业建立条件。 除非更改它们,否则每个作业都有默认的作业选项。 由于作业选项可能会阻止作业在计划时间运行,因此请务必了解作业选项并谨慎使用它们。

PowerShell 使用的作业选项与任务计划程序使用的作业选项相同。 有关作业选项的详细信息,请参阅 New-ScheduledJobOption 的帮助主题。

作业选项存储在计划的作业 XML 文件中。 可以在创建计划作业时设置作业选项,也可以随时更改它们。

New-ScheduledJobOption cmdlet 创建一个计划作业选项,其中 WakeToRun 计划作业选项设置为 True。 即使计算机在计划的开始时间处于睡眠或休眠状态, WakeToRun 选项也会运行计划作业。 命令将作业选项保存在 变量中 $O

$O = New-ScheduledJobOption -WakeToRun

如何获取作业选项

若要获取计划作业的作业选项,请使用 Get-ScheduledJobOption cmdlet。 使用 NameIDInputObject 参数指定计划的作业,而不是作业选项。

Get-ScheduledJobOption 获取 ProcessJob 的作业选项。

Get-ScheduledJobOption -Name ProcessJob
StartIfOnBatteries     : False
StopIfGoingOnBatteries : True
WakeToRun              : False
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

如何更改作业选项

可以在创建计划作业或编辑现有作业时更改计划作业的作业选项。

将 splated $JobParms 传递给 Add-JobTrigger cmdlet 以创建进程作业。 它使用 ScheduledJobOption 参数指定变量中的 $O 作业选项。

$JobParms = @{
  Name = "ProcessJob"
  ScriptBlock = {Get-Process}
  ScheduledJobOption = $O
}

Add-JobTrigger @JobParms

还可以随时将作业选项更改为现有的计划作业。 以下命令使用 Set-ScheduledJobOption cmdlet 将 ProcessJob scheduledJobWakeToRun 选项的值更改为 True

SetPSScheduledJob 模块中的 cmdlet(如 Set-ScheduledJobOption cmdlet)没有 NameID 参数。 可以使用 InputObject 参数指定计划作业选项,或者将计划作业从 Get-ScheduledJobOption cmdlet 管道传递给 Set-ScheduledJobOption

此示例使用 Get-ScheduledJob cmdlet 获取 ProcessJob。 它使用 Get-ScheduledJobOption cmdlet 获取 ProcessJob 中的作业选项,使用 Set-ScheduledJobOption cmdlet 将 ProcessJob 中的 WakeToRun 作业选项更改为 True。

Get-ScheduledJob -Name ProcessJob | Get-ScheduledJobOption |
 Set-ScheduledJobOption -WakeToRun

如何获取计划的作业实例

启动计划作业时,PowerShell 会创建类似于标准 PowerShell 后台作业的作业实例。 可以使用作业 cmdlet(如 Get-JobStop-JobReceive-Job 来管理作业实例。

注意

若要在计划作业的实例上使用作业 cmdlet,必须将 PSScheduledJob 模块导入到会话中。 若要导入 PSScheduledJob 模块,请键入 Import-Module PSScheduledJob 或使用任何计划作业 cmdlet,例如 Get-ScheduledJob

若要获取 PowerShell 计划作业的所有实例以及所有活动的标准作业,请使用 Get-Job cmdlet。 cmdlet Import-Module 导入 PSScheduledJob 模块并 Get-Job 获取本地计算机上的作业。

Import-Module PSScheduledJob
Get-Job

Get-Job 获取本地计算机上的 ProcessJob 实例。

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 在 Get-Job 管道中发送对象。 cmdlet Format-Table 显示计划作业 的 NameIDBeginTime 属性。

Get-Job ProcessJob | Format-Table -Property Name, ID, BeginTime
Name       Id BeginTime
----       -- ---------
ProcessJob 43 11/2/2011 3:00:02 AM
ProcessJob 44 11/3/2011 3:00:02 AM
ProcessJob 45 11/4/2011 3:00:02 AM
ProcessJob 46 11/5/2011 3:00:02 AM
ProcessJob 47 11/6/2011 3:00:02 AM
ProcessJob 48 11/7/2011 12:00:01 AM
ProcessJob 49 11/7/2011 3:00:02 AM
ProcessJob 50 11/8/2011 3:00:02 AM

获取计划的作业结果

若要获取计划作业实例的结果,请使用 Receive-Job cmdlet。

注意

若要在计划作业的实例上使用作业 cmdlet,必须将 PSScheduledJob 模块导入到会话中。 若要导入 PSScheduledJob 模块,请键入 Import-Module PSScheduledJob 或使用任何计划作业 cmdlet,例如 Get-ScheduledJob

此示例获取 ProcessJob 计划作业的最新实例的结果, (ID = 51) 。

Import-Module PSScheduledJob
Receive-Job -ID 51 -Keep

计划作业的结果保存在磁盘上,因此不需要 的 Keep 参数 Receive-Job 。 但是,如果没有 Keep 参数,则在每个 PowerShell 会话中只能获取一次计划作业的结果。 若要启动新的 PowerShell 会话,请键入 PowerShell 或打开新的 PowerShell 窗口。

另请参阅

about_Scheduled_Jobs_Advanced

about_Scheduled_Jobs_Troubleshooting

about_Scheduled_Jobs

about_Splatting.md

任务计划程序