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
检查作业状态。
$job = Start-Job -ScriptBlock { Get-Process } Receive-Job -Job $job
此示例启动一个获取进程的作业,然后检索结果。输出与直接运行Get-Process
相同,但以异步方式执行。
通过ID接收作业
可以使用作业ID而不是作业对象来接收作业。首先从Get-Job
输出中获取作业ID。然后将-Id参数与Receive-Job
一起使用。这在处理多个作业时很有用。
Start-Job -ScriptBlock { Get-Service } $jobId = (Get-Job).Id Receive-Job -Id $jobId
这会启动一个获取服务的作业,存储其ID,并接收输出。作业ID在每个会话中都是唯一的,并有助于识别特定的作业。
通过名称接收作业
创建作业时可以为其命名,以便于识别。使用Start-Job
的-Name参数。然后使用相同的名称与Receive-Job
一起接收结果。命名作业简化了复杂脚本中的管理。
Start-Job -Name "ServiceJob" -ScriptBlock { Get-Service } Receive-Job -Name "ServiceJob"
这会创建一个已命名的作业来获取服务并接收其输出。与使用ID或作业对象相比,名称使作业更容易引用。
接收后保留作业结果
默认情况下,作业结果在接收后会被删除。使用-Keep参数可以保留结果。这允许多次接收输出。在接收结果之前,作业仍必须已完成。
$job = Start-Job -ScriptBlock { 1..5 } Receive-Job -Job $job -Keep Receive-Job -Job $job -Keep
此作业输出数字1到5。-Keep参数允许接收两次结果。如果没有-Keep,第二次接收将返回空。
接收部分作业结果
对于长时间运行的作业,您可以随着结果的可用而接收部分结果。使用-WriteEvents参数来流式传输输出。在接收部分结果的同时,作业会继续运行。这对于监视进度很有用。
$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获取原始对象。这会保留所有属性和方法。原始对象有助于在脚本中进行进一步处理。
$job = Start-Job -ScriptBlock { Get-Process -Name "notepad" } $results = Receive-Job -Job $job -AutoFormat:$false $results | Get-Member
这会获取记事本进程作为原始对象。Get-Member
cmdlet显示所有可用的属性和方法。输出未格式化以供显示。
接收作业错误输出
作业可以产生与标准输出分开的错误输出。使用-Error参数接收错误流。这有助于诊断后台作业中的问题。默认情况下,不会接收错误输出。
$job = Start-Job -ScriptBlock { Get-Item "nonexistentfile.txt" -ErrorAction SilentlyContinue } Receive-Job -Job $job -Error
此作业尝试访问一个不存在的文件。-Error参数会检索错误消息。如果没有它,错误就会被忽略。
从远程计算机接收作业
可以使用Invoke-Command
在远程计算机上运行作业。使用带-Session参数的Receive-Job
来获取结果。作业必须使用Invoke-Command -AsJob
创建。
$session = New-PSSession -ComputerName "Server01" $job = Invoke-Command -Session $session -ScriptBlock { Get-Process } -AsJob Receive-Job -Job $job
这会创建一个远程会话并在Server01上运行一个作业。结果在本地接收。远程作业的工作方式与本地作业类似,但在另一台计算机上执行。
来源
在本文中,我们介绍了PowerShell中的Receive-Job cmdlet。
作者
列出 所有 PowerShell 教程。