Receive-Job
获取当前会话中 Windows PowerShell 后台作业的结果。
语法
Receive-Job [-Job] <Job[]> [[-ComputerName] <string[]>] [-Keep] [-NoRecurse] [<CommonParameters>]
Receive-Job [[-InstanceId] <Guid[]>] [-Keep] [-NoRecurse] [<CommonParameters>]
Receive-Job [-Job] <Job[]> [[-Location] <string[]>] [-Keep] [-NoRecurse] [<CommonParameters>]
Receive-Job [[-Name] <string[]>] [-Keep] [-NoRecurse] [<CommonParameters>]
Receive-Job [-Job] <Job[]> [[-Session] <PSSession[]>] [-Keep] [-NoRecurse] [<CommonParameters>]
Receive-Job [-Id] <Int32[]> [-Keep] [-NoRecurse] [<CommonParameters>]
说明
Receive-Job cmdlet 获取 Windows Powershell 后台作业的结果。使用 Receive-Job 可获取通过使用 Start-Job cmdlet 或任何 cmdlet 的 AsJob 参数启动的作业的结果。您可以获取所有作业的结果,或通过作业的名称、ID、实例 ID、计算机名、位置、会话或通过提交作业对象来标识作业。
启动 Windows PowerShell 后台作业时,该作业会启动,但结果不会立即显示,而是由命令返回一个表示该后台作业的对象。作业对象包含作业的有用信息,但不包含结果。使用该方法可以在作业运行的同时继续在会话中工作。有关 Windows PowerShell 中的后台作业的详细信息,请参阅 about_Jobs。
若要获取命令的结果,请使用 Receive-Job cmdlet。Receive-Job 获取在提交 Receive-Job 命令之前已经生成的结果。如果结果不完整,可以运行其他 Receive-Job 命令来获取剩余的结果。
默认情况下,当您收到作业结果时,作业结果将从系统中删除,但您可以使用 Keep 参数来保存结果,以便您可以再次收到它们。若要删除作业结果,请再次接收它们(不使用 Keep 参数),然后关闭会话,或者使用 Remove-Job cmdlet 将作业从会话中删除。
参数
-ComputerName <string[]>
获取在指定计算机上运行的作业的结果。输入计算机名称。默认值为当前会话中的所有作业。
此参数从存储在本地计算机上的作业结果中进行选择。它不会从远程计算机中获取数据。若要获取存储在远程计算机上的作业结果,请使用 Invoke-Command cmdlet 远程运行一个 Receive-Job 命令。
是否为必需? |
false |
位置? |
2 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-Id <Int32[]>
获取具有指定 ID 的作业的结果。默认值为当前会话中的所有作业。
ID 是一个整数,用于在当前会话中唯一标识作业。它比实例 ID 更便于记忆和键入,但它只在当前会话中是唯一的。可以键入一个或多个 ID(以逗号分隔)。要查找作业的 ID,请键入不带参数的“Get-Job”。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-InstanceId <Guid[]>
获取具有指定实例 ID 的作业的结果。默认值为当前会话中的所有作业。
实例 ID 是一个 GUID,用于在计算机上唯一地标识作业。要查找某个作业的实例 ID,请使用 Get-Job cmdlet。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-Job <Job[]>
指定要检索其结果的作业。Receive-Job 命令需要此参数。输入包含作业的变量或获取作业的命令。也可以将作业对象通过管道传送到 Receive-Job。
是否为必需? |
true |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByValue, ByPropertyName) |
是否接受通配符? |
false |
-Keep
在系统中保存作业结果,即使您已收到这些结果。默认情况下,作业结果在检索到后便会被删除。
要删除结果,请在不使用 Keep 参数的情况下再次使用 Receive-Job 接收结果,关闭会话,或者使用 Remove-Job cmdlet 将该作业从会话中删除。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Location <string[]>
仅获取指定位置的作业的结果。默认值为当前会话中的所有作业。
是否为必需? |
false |
位置? |
2 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-Name <string[]>
获取具有指定友好名称的作业的结果。默认值为当前会话中的所有作业。
是否为必需? |
false |
位置? |
1 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
-NoRecurse
仅获取指定作业中的结果。默认情况下,Receive-Job 还获取指定作业的所有子作业的结果。
是否为必需? |
false |
位置? |
named |
默认值 |
|
是否接受管道输入? |
false |
是否接受通配符? |
false |
-Session <PSSession[]>
获取在指定的 Windows Powershell 会话 (PSSession) 中运行的作业的结果。输入包含 PSSession 的变量或者用来获取 PSSession 的命令,例如 Get-PSSession 命令。默认值为当前会话中的所有作业。
是否为必需? |
false |
位置? |
2 |
默认值 |
|
是否接受管道输入? |
true (ByPropertyName) |
是否接受通配符? |
false |
<CommonParameters>
此 cmdlet 支持通用参数:-Verbose、-Debug、-ErrorAction、-ErrorVariable、-OutBuffer 和 -OutVariable。有关详细信息,请参阅 about_Commonparameters.
输入和输出
输入类型是指可通过管道传递给 cmdlet 的对象的类型。返回类型是指 Cmdlet 所返回对象的类型。
输入 |
System.Management.Automation.Job 可将作业对象通过管道传送到 Receive-Job。 |
输出 |
PSObject Receive-Job 返回作业中命令的结果。 |
示例 1
C:\PS>$job = start-job -scriptblock {get-process}
C:\PS> receive-job -job $job
说明
-----------
这些命令使用 Job 参数来获取特定作业的结果。第一个命令使用 Start-Job cmdlet 来启动运行“Get-Process”命令的作业。此命令使用赋值运算符 (=) 将生成的作业对象保存在 $job 变量中。
第二个命令使用 Receive-Job cmdlet 来获取作业的结果。它使用 Job 参数来指定作业。
示例 2
C:\PS>$job = start-job -scriptblock {get-process}
C:\PS> $job | receive-job
说明
-----------
此示例与示例 2 相同,只是该命令使用管道运算符 (|) 将作业对象发送到 Receive-Job。因此,该命令不需要 Job 参数来指定作业。
示例 3
C:\PS>$j = invoke-command -computername Server01, Server02, Server03 -scriptblock {get-service} -AsJob
C:\PS> $j.childjobs
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
2 Job2 Completed True Server01 get-service
3 Job3 Completed True Server02 get-service
4 Job4 Completed True Server03 get-service
C:\PS> receive-job -name Job3 -keep
Status Name DisplayName PSComputerName
------ ----------- ----------- --------------
Running AeLookupSvc Application Experience Server02
Stopped ALG Application Layer Gateway Service Server02
Running Appinfo Application Information Server02
Running AppMgmt Application Management Server02
说明
-----------
这些命令使用 Receive-Job 的 Name 参数来获取远程计算机上运行的若干后台作业之一的结果。
第一个命令使用 Invoke-Command cmdlet 启动一个后台作业,该作业在三台远程计算机上运行一个 Get-Service 命令。此命令使用 AsJob 参数将命令作为后台作业运行。此命令将生成的作业对象保存在 $j 变量中。
使用 Invoke-Command 的 AsJob 参数启动作业时,作业对象创建在本地计算机上,即使作业在远程计算机上运行也是如此。因此,可以使用本地命令来管理作业。
另外,当您使用 AsJob 时,Windows PowerShell 将返回一个作业对象,该对象包含与启动的每个作业对应的子作业。在本例中,作业对象包含三个子作业,分别对应于每台远程计算机上的每个作业。
第二个命令使用点表示法显示 $j 中的作业对象的 ChildJobs 属性值。显示内容说明该命令创建了三个子作业,分别对应于每台远程计算机上的作业。
第三个命令使用 Receive-Job cmdlet 获取在计算机 Server02 上运行的子作业 Job3 的结果。它使用 Name 参数来指定子作业的名称,使用 Keep 参数来保存作业结果,即使已收到这些结果。
示例 4
C:\PS>$s = new-pssession -computername Server01, Server02, Server03
C:\PS> $j = invoke-command -session $s -scriptblock {start-job -scriptblock {get-eventlog -logname system}}
C:\PS> $j
Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Completed True Localhost get-eventlog system
2 Job2 Completed True Localhost get-eventlog system
3 Job3 Completed True Localhost get-eventlog system
C:\PS> $results = invoke-command -session $s -scriptblock {param($j) receive-job -job $j} -ArgumentList $j
说明
-----------
此示例说明如何获取在三台远程计算机上运行的后台作业的结果。
第一个命令使用 New-PSSession cmdlet 创建三个 PSSession,分别位于命令中指定的每台服务器上。PSSession 保存在 $s 变量中。
第二个命令使用 Invoke-Command cmdlet 在 $s 变量中的每个 PSSession 中运行一个 Start-Job 命令。此作业运行一个获取系统日志中的事件的 Get-Eventlog 命令。该命令将结果保存在 $j 变量中。
由于该命令使用 Invoke-Command 来运行 Start-Job 命令,因此它实际上在三台计算机中的每一台上启动了三个独立的作业。因此,该命令返回了三个作业对象来表示在三台不同计算机本地运行的三个作业。
第三个命令显示 $j 中的三个作业对象。
第四个命令使用 Invoke-Command 在 $s 中的每个 PSSession 中运行 Receive-Job 命令,并将结果保存到 $results 变量中。
由于 $j 是局部变量,因此脚本块使用“param”关键字来声明命令中的变量,并使用 ArgumentList 参数来提供 $j 的值。
另请参阅
概念
about_Jobs
about_Job_Details
about_Remote_Jobs
Start-Job
Get-Job
Wait-Job
Stop-Job
Remove-Job
Invoke-Command