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-ScheduledJobSet-ScheduledJob cmdlet 的 MaxResultCount 参数。

若要删除计划作业的执行历史记录和所有结果,请使用 Set-ScheduledJob cmdlet 的 ClearExecutionHistory 参数。 删除此执行历史记录不会阻止 PowerShell 保存计划作业的新实例的结果。

以下示例使用散列传递来创建 $JobParms,后者是传递给 Register-ScheduledJob cmdlet 的参数值。 有关详细信息,请参阅 about_Splatting.mdRegister-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

另请参阅