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.md。
Register-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-Job
、Stop-Job
和 Receive-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 窗口。