about_Scheduled_Jobs_Troubleshooting

应用到: Windows PowerShell 3.0, Windows PowerShell 4.0

主题

about_Scheduled_Jobs_Troubleshooting

简短说明

说明如何解决有关计划作业的问题

详细说明

本部分介绍一些你在使用 Windows PowerShell® 的计划作业功能时可能遇到的问题,并且提出针对这些问题的建议解决方案。

在使用 Windows PowerShell 计划作业前,请参阅 about_Scheduled_Jobs 和相关计划作业 about 主题。

本主题包含以下部分:

  • -- 找不到作业结果

  • -- 计划作业无法运行

  • -- 无法获取计划作业:计划作业已损坏

  • -- JOB CMDLET 无法一致地找到计划作业

找不到作业结果

  • -- 获取 Windows PowerShell 中的作业结果的基本方法

    当计划作业运行时,它将创建计划作业的“实例”。若要查看、管理和获取计划作业实例的结果,请使用 Job cmdlet。

    注意:若要在计划作业的实例上使用 Job cmdlet,PSScheduledJob 模块必须导入到会话中。若要导入 PSScheduledJob 模块,请键入“Import-module PSScheduledJob”(不带引号)或使用任何 Scheduled Job cmdlet,如 Get-ScheduledJob。

    若要获取计划作业的所有实例的列表,请使用 Get-Job cmdlet。

               PS C:\> Import-Module PSScheduledJob
               PS C:\> Get-Job ProcessJob
    
               Id     Name         PSJobTypeName   State         HasMoreData     Location
               --     ----         -------------   -----         -----------     --------
               43     ProcessJob   PSScheduledJob  Completed     False           localhost            
               44     ProcessJob   PSScheduledJob  Completed     False           localhost
               45     ProcessJob   PSScheduledJob  Completed     False           localhost           
               46     ProcessJob   PSScheduledJob  Completed     False           localhost
               47     ProcessJob   PSScheduledJob  Completed     False           localhost
               48     ProcessJob   PSScheduledJob  Completed     False           localhost
               49     ProcessJob   PSScheduledJob  Completed     False           localhost
               50     ProcessJob   PSScheduledJob  Completed     False           localhost
    

    以下命令使用 Format-Table cmdlet 在表中显示计划作业实例的 Name、ID 和 PSBeginTime 属性。

               PS C:\> Get-Job ProcessJob | Format-Table -Property Name, ID, PSBeginTime -Auto
    
               Name       Id PSBeginTime
               ----       -- ---------
               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.以下命令获取 ProcessJob (ID = 50) 的最新实例的结果。

               PS C:\> Receive-Job -ID 50
    
  • -- 用于查找磁盘上的作业结果的基本方法

    若要管理计划作业,请使用 Job cmdlet,例如 Get-Job 和 Receive-Job。

    如果 Get-Job 未获取作业实例或 Receive-Job 未获取作业结果,你可以在磁盘上搜索该作业的执行历史记录文件。执行历史记录包含所有已触发的作业实例的记录。

    验证以下路径中的计划作业的目录中是否存在以时间戳命名的目录:

            $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob
                 \<ScheduledJobName>\Output
    

    通常:

            C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJob
              \<ScheduledJobName>\Output
    

    例如,以下命令获取 ProcessJob 计划作业的磁盘上的执行历史记录。

            PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell
                    \ScheduledJobs\ProcessJob\Output
    
            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
    

    每个以时间戳命名的目录表示一个作业实例。每个作业实例的结果保存在以时间戳命名的目录中的 Results.xml 文件中。

    例如,以下命令获取 ProcessJob 计划作业的每个已保存实例的 Results.xml 文件。

            PS C:\> dir $home\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs
                             \ProcessJob\Output\*\Results.xml
    
            Directory: C:\Users\User01\Appdata\Local\Microsoft\Windows\PowerShell
                         \ScheduledJobs\ProcessJob\Output
    

    如果缺少 Results.xml 文件,则 Windows PowerShell 无法返回或显示作业结果。

  • -- Job cmdlet 可能无法获取计划作业实例或其结果,因为 PSScheduledJob 模块未导入到会话中。

    注意:在对计划作业实例使用 Job cmdlet 前,请验证 PSScheduledJob 模块是否包含在会话中。在没有模块的情况下,Job cmdlet 无法获取计划作业实例或其结果。

    若要导入 PSScheduledJob 模块,请键入:

               Import-Module PSScheduledJob
    
  • -- Receive-Job cmdlet 可能已在当前会话中返回结果。

    如果 Receive-Job 未返回作业实例结果,则可能是因为已在没有 Keep 参数的情况下在当前会话中为该作业实例运行 Receive-Job 命令。

    当在没有 Keep 参数的情况下使用 Receive-Job 时,Receive-Job 返回作业结果并将作业实例的 HasMoreData 属性设置为 False,以指示它已返回该作业实例的所有结果并且没有要返回的更多结果。此设置适用于标准后台作业,但不适用于已保存到磁盘的计划作业的实例。

    若要再次获取作业实例结果,请启动一个新 Windows PowerShell 会话(键入不带引号的“PowerShell”)、导入 PSScheduledJob 模块,然后再次尝试 Receive-Job 命令。

               PS C:\> Receive-Job -ID 50
               PS C:\>                     #No results
               PS C:\> PowerShell
    
               Windows PowerShell
               Copyright (C) 2012 Microsoft Corporation. All rights reserved.
    
               PS C:\> Import-Module PSScheduledJob
               PS C:\> Receive-Job -ID 50 
    
               Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
               -------  ------    -----      ----- -----   ------     -- -----------
                  1213      33    12348      21676    88    25.71   1608 CcmExec
                    29       4     1168       2920    43     0.02    748 conhost
                    46       6     2208       4612    45     0.03   1640 conhost
               ...
    

    若要在会话中多次获取作业实例的结果,请使用 Receive-Job cmdlet 的 Keep 参数。

               PS C:\> Import-Module PSScheduledJob
               PS C:\> Receive-Job -ID 50 -Keep
    
               Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
               -------  ------    -----      ----- -----   ------     -- -----------
                  1213      33    12348      21676    88    25.71   1608 CcmExec
                    29       4     1168       2920    43     0.02    748 conhost
                    46       6     2208       4612    45     0.03   1640 conhost
    
    
               PS C:\> Receive-Job -ID 50 -Keep
    
               Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
               -------  ------    -----      ----- -----   ------     -- -----------
                  1213      33    12348      21676    88    25.71   1608 CcmExec
                    29       4     1168       2920    43     0.02    748 conhost
                    46       6     2208       4612    45     0.03   1640 conhost
    
  • -- 计划作业可能已损坏。

    如果计划作业变为已损坏,则 Windows PowerShell 将删除已损坏的计划作业及其结果。无法恢复已损坏的计划作业的结果。

    若要确定某个计划作业是否仍然存在,请使用 Get-ScheduledJob cmdlet。

               PS C:\> Get-ScheduledJob   
    
  • -- 结果数可能已超出计划作业的 ExecutionHistoryLength。

    计划作业的 ExecutionHistoryLength 属性可确定保存到磁盘的作业实例及其结果的数量。默认值为 32。当计划作业的实例数超过此值时,Windows PowerShell 将删除最早的作业实例以为每个新作业实例留出空间。

    若要获取计划作业的 ExecutionHistoryLength 属性的值,请使用以下命令格式:

               (Get-ScheduledJob <JobName>).ExecutionHistoryLength
    

    例如,以下命令获取 ProcessJob 计划作业的 ExecutionHistoryLength 属性的值。

               PS C:\> (Get-ScheduledJob ProcessJob).ExecutionHistoryLength
    

    若要设置或更改 ExecutionHistoryLength 属性的值,请使用 Register-ScheduledJob 和 Set-ScheduledJob cmdlet 的 MaxResultCount 参数。

    以下命令将 ExecutionHistoryLength 属性的值增加到 50。

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -MaxResultCount 50
    
  • -- 作业实例结果可能已删除

    Set-ScheduledJob cmdlet 的 ClearExecutionHistory 参数将删除作业的执行历史记录。可以使用此功能释放磁盘空间或删除不需要或已使用、分析或保存在不同位置的结果。

    若要删除计划作业的执行历史记录,请使用计划作业的 ClearExecutionHistory 参数。

    以下命令删除 ProcessJob 计划作业的执行历史记录。

               PS C:\> Get-ScheduledJob ProcessJob | Set-ScheduledJob -ClearExecutionHistory
    

    此外,Remove-Job cmdlet 删除作业结果。使用 Remove-Job 删除计划作业时,它会删除磁盘上的作业的所有实例,包括执行历史记录和所有作业结果。

  • -- 使用 Start-Job cmdlet 启动的作业不会保存到磁盘。

    使用 Start-Job 而不是使用作业触发器启动作业时,Start-Job 将启动标准后台作业。后台作业及其结果不存储在磁盘上的作业的执行历史记录中。

    你可以使用 Get-Job cmdlet 获取作业并使用 Receive-Job cmdlet 获取作业结果,但结果仅在你收到它们之后可用,除非你使用 Receive-Job cmdlet 的 Keep 参数。

    此外,后台作业及其结果特定于会话;它们仅存在于创建它们的会话中。如果你删除作业 (Remove-Job)、关闭会话或关闭 Windows PowerShell,将删除作业实例及其结果。

计划作业无法运行

  • -- 如果已禁用作业触发器或计划作业,则计划作业不会自动运行。

    使用 Get-ScheduledJob cmdlet 获取计划作业。验证计划作业的 Enabled 属性的值是否为 True ($true)。

        PS C:\> Get-ScheduledJob ProcessJob
    
        Id         Name            Triggers        Command         Enabled
        --         ----            --------        -------         -------
        4          ProcessJob      {1, 2}          Get-Process     True
    
    
        PS C:\> (Get-ScheduledJob ProcessJob).Enabled
        True
    

    使用 Get-JobTrigger cmdlet 获取计划作业的作业触发器。验证作业触发器的 Enabled 属性的值是否为 True ($true)

        PS C:\> Get-ScheduledJob ProcessJob | Get-JobTrigger
    
        Id         Frequency       Time                   DaysOfWeek              Enabled
        --         ---------       ----                   ----------              -------
        1          Weekly          11/7/2011 5:00:00 AM   {Monday, Thursday}      True
        2          Daily           11/7/2011 3:00:00 PM                           True
    
    
        PS C:\> Get-ScheduledJob ProcessJob | Get-JobTrigger | Format-Table ID, Enabled -Auto
    
        Id Enabled
        -- -------
        1    True
        2    True
    
  • -- 如果作业触发器无效,则计划作业不会自动运行。

    例如,作业触发器可能指定一个过去的日期或不存在的日期,如每月的第 5 个星期一。

  • -- 如果未满足作业触发器或作业选项的条件,则计划作业不会自动运行。

    例如,仅在特定用户登录计算机时运行的计划作业在该用户不登录或仅远程连接的情况下不会运行。

    检查计划作业的选项,并确保它们满足要求。例如,要求计算机处于空闲状态或要求网络连接或者具有长 IdleDuration 或短暂 IdleTimeout 的计划作业可能永远不会运行。

    使用 Get-ScheduledJobOption cmdlet 检查作业选项及其值。

           PS C:\> Get-ScheduledJob -Name ProcessJob
    
    
           StartIfOnBatteries     : False
           StopIfGoingOnBatteries : True
           WakeToRun              : True
           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
    

    有关计划作业选项的说明,请参阅有关 New-ScheduledJobOption cmdlet 的帮助主题 (https://go.microsoft.com/fwlink/?LinkID=223919)。

  • -- 计划作业实例可能已失败。

    如果计划作业命令失败,则 Windows PowerShell 将立即通过生成错误消息来报告它。但是,如果作业在任务计划程序尝试运行它时失败,则 Windows PowerShell 将不返回此错误。

    使用以下方法检测和更正作业失败。

    • -- 检查任务计划程序事件日志以查找错误。若要检查日志,请使用事件查看器或如下所示的 Windows PowerShell 命令:

              Get-WinEvent -LogName Microsoft-Windows-TaskScheduler/Operational | Where {$_.Message -like "*fail*"}
      
    • 在任务计划程序中检查作业记录。Windows PowerShell 计划作业存储在以下任务计划文件夹中:

              Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs
      
  • -- 计划作业可能由于权限不足而无法运行。

    计划作业使用创建该作业的用户权限或 Register-ScheduledJob 或 Set-ScheduledJob 命令中的 Credential 参数指定的用户权限来运行。

    如果该用户没有运行命令或脚本的权限,则作业将失败。

无法获取计划作业:计划作业已损坏

在少数情况下,计划作业可能会损坏或包含无法解决的内部矛盾。通常情况下,当手动编辑计划作业的 XML 文件时,会发生这种情况,从而产生无效的 XML。

当计划作业损坏时,Windows PowerShell 将尝试从磁盘中删除该计划作业、其执行历史记录及其结果。

如果它无法删除该计划作业,每次你运行 Get-ScheduledJob cmdlet 时都将收到损坏作业错误消息。

若要删除已损坏的计划作业,请使用以下方法之一。在此处插入部分正文。

  • -- 删除该计划作业的 <ScheduledJobName> 目录。不要删除 ScheduledJob 目录。

    该目录位于 $env:UserProfile\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName> 中

    通常:

           C:\Users\<UserName>\AppData\Local\Microsoft\Windows\PowerShell
             \ScheduledJobs\<ScheduledJobName>.
    
  • -- 使用任务计划程序删除计划任务。Windows PowerShell 计划任务显示在以下任何计划程序路径中:

           Task Scheduler Library\Microsoft\Windows\PowerShell\ScheduledJobs\<ScheduledJobName>
    

JOB CMDLET 无法一致地找到计划作业

当 PSScheduledJob 模块不在当前会话中时,Job cmdlet 无法获取计划作业、启动它们或获取其结果。

若要导入 PSScheduledJob 模块,请键入“Import-module PSScheduledJob”或者运行或获取模块中的任何 cmdlet,如 Get-ScheduledJob cmdlet。从 Windows PowerShell 3.0 开始,当你获取或使用模块中的任何 cmdlet 时,将自动导入模块。

当 PSScheduledJob cmdlet 不在当前会话中时,以下命令序列可行。

            PS C:\> Get-Job ProcessJob

            Get-Job : The command cannot find the job because the job name
            ProcessJob was not found. 
            Verify the value of the Name parameter, and then try the command again.
            + CategoryInfo          : ObjectNotFound: (ProcessJob:String) [Get-Job],
            PSArgumentException
            + FullyQualifiedErrorId : JobWithSpecifiedNameNotFound,Microsoft.PowerShell.
            Commands.GetJobCommand

            PS C:\> Get-Job
            PS C:\> Get-ScheduledJob ProcessJob

            Id         Name            Triggers        Command      Enabled
            --         ----            --------        -------      -------
            4          ProcessJob      {1}             Get-Process  True

            PS C:\> Get-Job ProcessJob

            Id     Name         PSJobTypeName   State       HasMoreData     Location
            --     ----         -------------   -----       -----------     --------
            43     ProcessJob   PSScheduledJob  Completed   True            localhost
            44     ProcessJob   PSScheduledJob  Completed   True            localhost
            45     ProcessJob   PSScheduledJob  Completed   True            localhost
            46     ProcessJob   PSScheduledJob  Completed   True            localhost
            47     ProcessJob   PSScheduledJob  Completed   True            localhost
            48     ProcessJob   PSScheduledJob  Completed   True            localhost
            49     ProcessJob   PSScheduledJob  Completed   True            localhost
            50     ProcessJob   PSScheduledJob  Completed   True            localhost

出现此行为是因为 Get-ScheduledJob 命令自动导入 PSScheduledJob 模块,然后运行该命令。

另请参阅

about_Scheduled_Jobs

about_Scheduled_Jobs_Basics

about_Scheduled_Jobs_Advanced