ZetCode

PowerShell Receive-Job

最后修改:2025 年 2 月 15 日

本文介绍了PowerShell中的Receive-Job cmdlet。它从使用Start-Job启动的后台作业中检索结果。后台作业允许异步运行命令。

作业基础

PowerShell作业代表一个在后台运行的命令。作业允许长时间运行的任务执行而不会阻塞控制台。每个作业都有一个唯一的ID和状态(正在运行、已完成、失败)。Receive-Job cmdlet获取已完成作业的结果。

基本的Receive-Job用法

使用Receive-Job最简单的方法是使用作业对象。首先使用Start-Job启动一个作业,然后检索其结果。在接收结果之前,必须先完成作业。您可以使用Get-Job检查作业状态。

receive1.ps1
$job = Start-Job -ScriptBlock { Get-Process }
Receive-Job -Job $job

此示例启动一个获取进程的作业,然后检索结果。输出与直接运行Get-Process相同,但以异步方式执行。

通过ID接收作业

可以使用作业ID而不是作业对象来接收作业。首先从Get-Job输出中获取作业ID。然后将-Id参数与Receive-Job一起使用。这在处理多个作业时很有用。

receive2.ps1
Start-Job -ScriptBlock { Get-Service }
$jobId = (Get-Job).Id
Receive-Job -Id $jobId

这会启动一个获取服务的作业,存储其ID,并接收输出。作业ID在每个会话中都是唯一的,并有助于识别特定的作业。

通过名称接收作业

创建作业时可以为其命名,以便于识别。使用Start-Job的-Name参数。然后使用相同的名称与Receive-Job一起接收结果。命名作业简化了复杂脚本中的管理。

receive3.ps1
Start-Job -Name "ServiceJob" -ScriptBlock { Get-Service }
Receive-Job -Name "ServiceJob"

这会创建一个已命名的作业来获取服务并接收其输出。与使用ID或作业对象相比,名称使作业更容易引用。

接收后保留作业结果

默认情况下,作业结果在接收后会被删除。使用-Keep参数可以保留结果。这允许多次接收输出。在接收结果之前,作业仍必须已完成。

receive4.ps1
$job = Start-Job -ScriptBlock { 1..5 }
Receive-Job -Job $job -Keep
Receive-Job -Job $job -Keep

此作业输出数字1到5。-Keep参数允许接收两次结果。如果没有-Keep,第二次接收将返回空。

接收部分作业结果

对于长时间运行的作业,您可以随着结果的可用而接收部分结果。使用-WriteEvents参数来流式传输输出。在接收部分结果的同时,作业会继续运行。这对于监视进度很有用。

receive5.ps1
$job = Start-Job -ScriptBlock { 1..10 | ForEach-Object { $_; Start-Sleep -Seconds 1 } }
while ($job.State -eq 'Running') {
    Receive-Job -Job $job -WriteEvents
    Start-Sleep -Milliseconds 500
}

此作业会输出带延迟的数字。脚本会接收正在生成的结果。循环将一直持续到作业完成。

将作业结果作为原始对象接收

默认情况下,结果会格式化以供显示。使用-AutoFormat:$false获取原始对象。这会保留所有属性和方法。原始对象有助于在脚本中进行进一步处理。

receive6.ps1
$job = Start-Job -ScriptBlock { Get-Process -Name "notepad" }
$results = Receive-Job -Job $job -AutoFormat:$false
$results | Get-Member

这会获取记事本进程作为原始对象。Get-Member cmdlet显示所有可用的属性和方法。输出未格式化以供显示。

接收作业错误输出

作业可以产生与标准输出分开的错误输出。使用-Error参数接收错误流。这有助于诊断后台作业中的问题。默认情况下,不会接收错误输出。

receive7.ps1
$job = Start-Job -ScriptBlock { Get-Item "nonexistentfile.txt" -ErrorAction SilentlyContinue }
Receive-Job -Job $job -Error

此作业尝试访问一个不存在的文件。-Error参数会检索错误消息。如果没有它,错误就会被忽略。

从远程计算机接收作业

可以使用Invoke-Command在远程计算机上运行作业。使用带-Session参数的Receive-Job来获取结果。作业必须使用Invoke-Command -AsJob创建。

receive8.ps1
$session = New-PSSession -ComputerName "Server01"
$job = Invoke-Command -Session $session -ScriptBlock { Get-Process } -AsJob
Receive-Job -Job $job

这会创建一个远程会话并在Server01上运行一个作业。结果在本地接收。远程作业的工作方式与本地作业类似,但在另一台计算机上执行。

来源

PowerShell 文档

在本文中,我们介绍了PowerShell中的Receive-Job cmdlet。

作者

我的名字是Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。我自2007年以来一直在撰写编程文章。迄今为止,我已撰写了1400多篇文章和8本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PowerShell 教程