about_Scheduled_Jobs_Advanced
简短说明
说明高级计划作业主题,包括构成计划作业的基础的文件结构。
长说明
有关 PSScheduledJob 模块中包含的 cmdlet 的详细信息,请参阅 PSScheduledJob。
计划作业目录和文件
PowerShell 计划作业既是 PowerShell 作业,又是任务计划程序任务。 每个计划作业都在任务计划程序中注册,并以 Microsoft .NET Framework 序列化 XML 格式保存在磁盘上。
创建计划作业时,PowerShell 会在本地计算机上的 $HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs
目录中为计划作业创建一个目录。 目录名称与作业名称相同。
下面是 ScheduledJobs 目录示例。
Get-ChildItem $HOME\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs
Directory: C:\Users\User01\AppData\Local
\Microsoft\Windows\PowerShell\ScheduledJobs
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 9/29/2011 10:03 AM ArchiveProjects
d---- 9/30/2011 1:18 PM Inventory
d---- 10/20/2011 9:15 AM Backup-Scripts
d---- 11/7/2011 10:40 AM ProcessJob
d---- 11/2/2011 10:25 AM SecureJob
d---- 9/27/2011 1:29 PM Test-HelpFiles
d---- 9/26/2011 4:22 PM DeployPackage
每个计划作业都有其自己的目录。 该目录包含计划作业 XML 文件和 Output 子目录。
$Path = "$HOME\AppData\Local\Microsoft\Windows\PowerShell"
$Path += "\ScheduledJobs\ProcessJob"
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/1/2011 3:00 PM Output
-a--- 11/1/2011 3:43 PM 7281 ScheduledJobDefinition.xml
计划作业的 Output 目录包含其执行历史记录。 每次作业触发器启动计划作业时,PowerShell 都会在输出目录中创建一个以时间戳命名的目录。 时间戳目录在 Results.xml 文件中包含作业结果,在 Status.xml 文件中包含作业状态。
以下命令显示 ProcessJob 计划作业的执行历史记录目录。
$Path = "$HOME\AppData\Local\Microsoft"
$Path += "\Windows\PowerShell\ScheduledJobs\ProcessJob\Output"
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft
\Windows\PowerShell\ScheduledJobs\ProcessJob\Output
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 11/2/2011 3:00 AM 20111102-030002-260
d---- 11/3/2011 3:00 AM 20111103-030002-277
d---- 11/4/2011 3:00 AM 20111104-030002-209
d---- 11/5/2011 3:00 AM 20111105-030002-251
d---- 11/6/2011 3:00 AM 20111106-030002-174
d---- 11/7/2011 12:00 AM 20111107-000001-914
d---- 11/7/2011 3:00 AM 20111107-030002-376
$Path = "$HOME\AppData\Local\Microsoft\Windows\PowerShell\"
$Path += "ScheduledJobs\ProcessJob\Output\20111102-030002-260"
Get-ChildItem $Path
Directory: C:\Users\User01\AppData\Local\Microsoft\Windows\PowerShell
\ScheduledJobs\ProcessJob\Output\20111102-030002-260
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 11/2/2011 3:00 AM 581106 Results.xml
-a--- 11/2/2011 3:00 AM 9451 Status.xml
可以打开并检查 ScheduledJobDefinition.xml、Results.xml 和 Status.xml 文件,或使用 Select-XML
cmdlet 分析这些文件。
警告
请勿编辑 XML 文件。 如果任何 XML 文件包含无效 XML,PowerShell 将删除计划作业及其执行历史记录(包括作业结果)。
立即启动计划作业
可以通过以下两种方式之一立即启动计划作业:
- 运行
Start-Job
cmdlet 以启动任何计划作业。 - 将 RunNow 参数添加到
Register-ScheduledJob
命令,以在运行该命令后立即启动作业。
使用 Start-Job
cmdlet 启动的作业是标准 PowerShell 后台作业,而不是计划作业的实例。 与所有后台作业一样,这些作业会立即启动,不受作业选项的约束,也不受作业触发器的影响。 作业输出不会保存在计划作业目录的 Output 目录中。
以下命令使用 Start-Job
cmdlet 的 DefinitionName 参数来启动 ProcessJob 计划作业。
Start-Job -DefinitionName ProcessJob
若要管理作业并获取作业结果,请使用作业 cmdlet。 有关作业 cmdlet 的详细信息,请参阅 about_Jobs。
注意
若要对计划作业的实例使用作业 cmdlet,必须将 PSScheduledJob 模块导入到会话中。 若要导入 PSScheduledJob 模块,请输入 Import-Module PSScheduledJob
或使用任何计划作业 cmdlet,例如 Get-ScheduledJob
。
重命名计划作业
若要重命名计划作业,请使用 Set-ScheduledJob
cmdlet 的 Name 参数。 重命名计划作业时,PowerShell 会更改计划作业的名称和计划作业目录。 但是,它不会更改已运行的计划作业实例的名称。
获取开始和结束时间
若要获取作业实例的开始和结束日期和时间,请使用 Get-Job
为计划作业返回的 ScheduledJob 对象的 PSBeginTime 和 PSEndTime 属性。
以下示例使用 Format-Table
cmdlet 的 Property 参数在表中显示每个作业实例的 PSBeginTime 和 PSEndTime 属性。 名为 Label 的计算属性显示每个作业实例所用的时间。
Get-job -Name UpdateHelpJob |
Format-Table -Property ID, PSBeginTime, PSEndTime,
@{Label="Elapsed Time";Expression={$.PsEndTime - $.PSBeginTime}}
Id PSBeginTime PSEndTime Elapsed Time
-- ----------- --------- ------------
2 11/3/2011 3:00:01 AM 11/3/2011 3:00:39 AM 00:00:38.0053854
3 11/4/2011 3:00:02 AM 11/4/2011 3:01:01 AM 00:00:59.1188475
4 11/5/2011 3:00:02 AM 11/5/2011 3:00:50 AM 00:00:48.3692034
5 11/6/2011 3:00:01 AM 11/6/2011 3:00:54 AM 00:00:52.8013036
6 11/7/2011 3:00:01 AM 11/7/2011 3:00:38 AM 00:00:37.1930350
7 11/8/2011 3:00:01 AM 11/8/2011 3:00:57 AM 00:00:56.2570556
8 11/9/2011 3:00:03 AM 11/9/2011 3:00:55 AM 00:00:51.8142222
9 11/10/2011 3:00:02 AM 11/10/2011 3:00:42 AM 00:00:40.7195954
管理执行历史记录
你可以确定为每个计划作业保存的作业实例结果的数量,并删除任何计划作业的执行历史记录和保存的作业结果。
计划作业的 ExecutionHistoryLength 属性决定了为计划作业保存多少个作业实例结果。 当保存的结果数超过 ExecutionHistoryLength 属性的值时,PowerShell 会删除最旧实例的结果,为最新实例的结果腾出空间。
默认情况下,PowerShell 保存每个计划作业的 32 个实例的执行历史记录和结果。 若要更改该值,请使用 Register-ScheduledJob
或 Set-ScheduledJob
cmdlet 的 MaxResultCount 参数。
若要删除计划作业的执行历史记录和所有结果,请使用 Set-ScheduledJob
cmdlet 的 ClearExecutionHistory 参数。 删除此执行历史记录不会阻止 PowerShell 保存计划作业的新实例的结果。
以下示例使用散列传递来创建 $JobParms
,后者是传递给 Register-ScheduledJob
cmdlet 的参数值。 有关详细信息,请参阅 about_Splatting.md。
Register-ScheduledJob
使用 @JobParms
创建计划作业。 该命令使用值为 12 的 MaxResultCount 参数,仅保存计划作业的 12 个最新作业实例结果。
$JobParms = @{
Name = "ProcessJob"
ScriptBlock = {Get-Process}
MaxResultCount = "12"
}
Register-ScheduledJob @JobParms
以下命令使用 Set-ScheduledJob
cmdlet 的 MaxResultCount 参数将保存的实例结果数增加到 15。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 15
以下命令删除 ProcessJob 计划作业的执行历史记录和当前的已保存结果。
Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
以下命令获取计算机上所有计划作业的名称和 ExecutionHistoryLength 属性的值,并将它们显示在表格中。
Get-ScheduledJob |
Format-Table -Property Name, ExecutionHistoryLength -AutoSize