about_Jobs

主题
    about_Jobs

简短说明
    提供有关 Windows PowerShell 后台作业如何在后台运行命令或表达式而不与当前会话交互的信息。

详细说明
    本主题说明如何在本地计算机的 Windows PowerShell 中运行后台作业。有关在远程计算机上
    运行后台作业的信息,请参阅 about_Remote_Jobs。
    
    启动后台作业时,命令提示符会立即返回,即使该作业需要较长时间才能完成也是如此。
    您可以在作业运行的同时继续在此会话中工作,而不会产生中断。

    重要说明:通过使用 Start-Job 或使用 Invoke-Command 的 AsJob 参数启动的后台作业依赖于 
    Windows PowerShell 远程处理基础结构。若要使用这些功能,即使后台作业只在本地计算机上运行,
    也必须为 Windows PowerShell 配置远程处理。有关详细信息,请参阅 
    about_Remote_Requirements。

 
        
 如何在本地计算机上启动作业
    若要在本地计算机上启动后台作业,请使用 Start-Job cmdlet。

    若要编写 Start-Job 命令,请将作业运行的命令用大括号 ({}) 括起。请使用 ScriptBlock 参数来
    指定命令。

    下面的命令启动一个后台作业,该作业在本地计算机上运行 Get-Process 命令。

        start-job -scriptblock {get-process}


    Start-Job 命令返回一个表示该作业的对象。作业对象包含作业的有用信息,但不包含作业结果。
    
    将作业对象保存在变量中,然后将它用于其他作业 cmdlet 以管理该后台作业。下面的命令启动一个作业
    对象,然后将生成的作业对象保存在 $job 变量中。

        $job = start-job -scriptblock {get-process}

    此外,还可以使用 Get-Job cmdlet 获取表示在当前会话中启动的作业的对象。Get-Job 返回的作业
    对象与 Start-Job 返回的相同。

 
 获取作业对象

    若要获取表示在当前会话中启动的后台作业的对象,请使用 Get-Job cmdlet。如果没有参数,则 Get-
    Job 返回在当前会话中启动的所有作业。

    例如,下面的命令获取当前会话中的作业。

    get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Running    True         localhost  get-process


    此外,还可以将作业对象保存在变量中,并在后面的命令中使用该变量表示相应作业。
    下面的命令获取 ID 为 1 的作业并将其保存在变量 $job 中。

       $job = get-job -id 1


    作业对象包含指示作业是否已完成的作业状态。已完成的作业的状态为"Complete"或"Failed"。
    作业也可能处于"Blocked"或"Running"状态。


    get-job


        Id  Name  State       HasMoreData  Location   Command
        --  ----  -----       -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process



 获取作业的结果

    运行后台作业时,不会立即显示结果。实际上,Start-Job cmdlet 返回表示作业的作业对象,但不包
    含结果。若要获取后台作业的结果,请使用 Receive-Job cmdlet。

    下面的命令使用 Receive-Job cmdlet 获取作业结果。它使用保存在 $job 变量中的作业对象来标识
    作业。

    receive-job -job $job

     Receive-Job cmdlet 返回作业结果。


           Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
           -------  ------    -----      ----- -----   ------    -- -----------
               103       4    11328       9692    56           1176 audiodg
               804      14    12228      14108   100   101.74  1740 CcmExec
               668       7     2672       6168   104    32.26   488 csrss
       ...

     也可以将作业结果保存在变量中。下面的命令将 $job 变量中的作业的结果保存在 $results 变量
     中。

    $results = receive-job -job $job

     此外,还可以通过使用重定向运算符 (>) 或 Out-File cmdlet 将作业结果保存在文件中。下面的命
     令使用重定向运算符将作业结果保存在 Results.txt 文件的 $job 变量中。


        receive-job -job $job > results.txt


    

 获取和保留部分作业结果

    Receive-Job cmdlet 返回后台作业的结果。如果作业完成,则 Receive-Job 返回作业的完整结
    果。如果作业仍在运行,则 Receive-Job 获取到目前为止已生成的结果。再次运行 Receive-Job 命
    令可以获取其余结果。

    当 Receive-Job 返回结果时,默认情况下,它会删除存储作业结果的缓存中的结果。如果运行另一个 
    Receive-Job 命令,则只获取尚未收到的结果。

    下面的命令说明在作业完成之前运行的 Receive-Job 命令的结果。


    C:\PS> receive-job -job $job

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec


    C:\PS> receive-job -job $job

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
             68       3     2632        664    29     0.36   1388 ccmsetup
            749      22    21468      19940   203   122.13   3644 communicator
            905       7     2980       2628    34   197.97    424 csrss
           1121      25    28408      32940   174   430.14   3048 explorer


    若要防止 Receive-Job 删除它所返回的作业结果,请使用 Keep 参数。这样,Receive-Job 将返回
    此前生成的所有结果。

    下面的命令说明对尚未完成的作业使用 Keep 参数的效果。

    C:\PS> receive-job -job $job -keep

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec


    C:\PS> receive-job -job $job -keep

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            103       4    11328       9692    56            1176 audiodg
            804      14    12228      14108   100   101.74   1740 CcmExec
             68       3     2632        664    29     0.36   1388 ccmsetup
            749      22    21468      19940   203   122.13   3644 communicator
            905       7     2980       2628    34   197.97    424 csrss
           1121      25    28408      32940   174   430.14   3048 explorer


    
等待结果

    如果运行需要很长时间才能完成的命令,则可以使用作业对象的属性来确定作业何时完成。下面的命令使用 
    Get-Job 对象获取当前会话中的所有后台作业。

    get-job

    结果显示在一个表中。作业状态显示在 State 列中。

        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process
        2   Job2  Running     True         localhost  get-eventlog -log syst...
        3   Job3  Complete    True         localhost  dir -path c:\* -recurse



    在本例中,从 State 属性可以看出 Job 2 仍在运行。如果此时要使用 Receive-Job cmdlet 获取
    作业结果,则结果将是不完整的。可以重复使用 Receive-Job cmdlet 以获取所有结果。默认情况下,
    每次使用该 cmdlet 时,都只获取尚未收到的结果,不过,可以使用 Receive-Job cmdlet 的 Keep 
    参数来保留结果(即使已收到这些结果)。

    此时,可以将结果写入文件,然后在新收到的结果到达时进行追加。也可以等待,稍后再检查作业的状态。

    此外,还可以使用 Wait-Job cmdlet 等待作业的任意或所有结果。使用 Wait-Job 可以等待特定作
    业、所有作业或任何要完成的作业。
  
    下面的命令使用 Wait-Job cmdlet 等待 ID 为 10 的作业。

    wait-job -ID 10

    结果是,在作业完成之前,都禁止显示 Windows PowerShell 提示符。

    等待时间也可以是预定的时间段。下面的命令使用 Timeout 参数将等待时间限制为 120 秒。超过该时
    间时,命令提示符会返回,但作业继续在后台运行。

    wait-job -ID 10 -timeout 120


停止作业

    若要停止后台作业,请使用 Stop-Job cmdlet。下面的命令启动一个作业,以获取系统事件日志中的每
    个条目。它将作业对象保存在 $job 变量中。

    $job = start-job -scriptblock {get-eventlog -log system}
    下面的命令停止该作业。它使用管道运算符 (|) 将 $job 变量中的作业发送到 Stop-Job。

    $job | stop-job


删除作业

    若要删除后台作业,请使用 Remove-Job cmdlet。下面的命令删除 $job 变量中的作业。

    remove-job -job $job


调查失败的作业

    若要查明作业失败的原因,请使用作业对象的 Reason 子属性。

    下面的命令在未使用所需凭据的情况下启动作业。它将作业对象保存在 $job 变量中。


         $job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}

         Id   Name  State    HasMoreData  Location   Command
         --   ----  -----    -----------  --------   -------
         1    Job1  Failed   False         localhost  new-item -path HKLM:\S...


    下面的命令使用 Reason 属性查找导致作业失败的错误。

         $job.ChildJobs[0].JobStateInfo.Reason


    在本例中,作业失败的原因是远程计算机需要显式凭据才能运行该命令。Reason 属性的值为:

         Connecting to remote server failed with the following error 
         message : Access is denied.


作业 Cmdlet

    Start-Job        在本地计算机上启动后台作业。

    Get-Job          获取在当前会话中启动的后台作业。

    Receive-Job      获取后台作业的结果。

    Stop-Job         停止后台作业。

    Wait-Job         禁止显示命令提示符,直到一个或所有作业完成。

    Remove-Job       删除后台作业。

    Invoke-Command   AsJob 参数在远程计算机上将任何命令都作为后台作业运行。此外,还可以使用 
                 Invoke-Command 远程运行任何作业命令,包括 Start-Job 命令。

 
另请参阅
   about_Remote_Jobs
   about_Job_Details
   about_Remote
   about_PSSessions  
   Start-Job
   Get-Job
   Receive-Job
   Stop-Job
   Wait-Job
   Remove-Job
   Invoke-Command