about_Scheduled_Jobs_Basics

简短说明

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

长说明

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

有关 PSScheduledJob 模块中包含的 cmdlet 的详细信息,请参阅 PSScheduledJob

如何创建计划作业

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

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

Register-ScheduledJob cmdlet 创建 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 的帮助主题。

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

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

Register-ScheduledJob @JobParms

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

Add-JobTrigger -Name ProcessJob -Trigger $T

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

如何获取作业触发器

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

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。 使用 Name、ID 和 InputObject 参数指定计划作业,而不是作业选项。

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

如何更改作业选项

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

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

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

Add-JobTrigger @JobParms

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

PSScheduledJob 模块中的 Set cmdlet(如 Set-ScheduledJobOption cmdlet)没有 Name 或 ID 参数。 可以使用 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。 Import-Module cmdlet 导入 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

默认的显示不会显示开始时间,该时间通常可区分同一计划作业的各个实例。

Get-Job cmdlet 通过管道发送对象。 Format-Table cmdlet 显示计划作业的 Name、ID 和 BeginTime 属性。

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

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

另请参阅