关于计划作业基础知识
简短说明
说明如何创建和管理计划作业。
长说明
本文档演示如何执行创建和管理计划作业的基本任务。 有关更多高级任务的信息,请参阅 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。 使用 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
如何更改作业选项
可以在创建计划作业或编辑现有作业时更改计划作业的作业选项。
将 splated $JobParms
传递给 Add-JobTrigger
cmdlet 以创建进程作业。 它使用 ScheduledJobOption 参数指定变量中的 $O
作业选项。
$JobParms = @{
Name = "ProcessJob"
ScriptBlock = {Get-Process}
ScheduledJobOption = $O
}
Add-JobTrigger @JobParms
还可以随时将作业选项更改为现有的计划作业。
以下命令使用 Set-ScheduledJobOption
cmdlet 将 ProcessJob scheduledJob 的 WakeToRun 选项的值更改为 True。
Set
PSScheduledJob 模块中的 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-Job
) Stop-Job
和 Receive-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
显示计划作业 的 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
计划作业的结果保存在磁盘上,因此不需要 的 Keep 参数 Receive-Job
。 但是,如果没有 Keep 参数,则在每个 PowerShell 会话中只能获取一次计划作业的结果。 若要启动新的 PowerShell 会话,请键入 PowerShell
或打开新的 PowerShell 窗口。