如何捕获作业的信息输出流?
Posted
技术标签:
【中文标题】如何捕获作业的信息输出流?【英文标题】:How can I capture the Information output stream of a Job? 【发布时间】:2021-06-29 17:52:09 【问题描述】:如果我开始一项工作,并且该工作将消息输出到信息流(或与此相关的任何流),我如何将其捕获到一个变量中,或者在我收到工作后简单地输出它?
$script =
[PSCustomObject]@ "CoolProperty" = "CoolValue"
Write-Information "Returning a cool object" -InformationAction "Continue"
Start-Job -Name "test" -ScriptBlock $script | Out-Null
Wait-Job -Name "test" | Out-Null
$result = Receive-Job -Name "test" 6>&1
Remove-Job -Name "test"
上面的代码会输出
Returning a cool object
到控制台,但我想捕获它并将其输出到我用于整个脚本的日志文件中,例如:
$JustTheInfoStreamFromJob | Out-File "c:\file.log" -Append
我不想记录捕获的$result
,因为它还包含输出流(即对象)。我只想记录信息流。所以我正在寻找一种方法来分离它。
我看到有一个-InformationVariable
参数,但我不明白如何使用它,或者它是否与我的问题相关。我已经尝试了几种重定向方法,但对于流媒体我几乎不知道自己在做什么。
这个question给了我一些提示,但还不够理解。
这个question 非常相似,但似乎在信息流存在之前就已被询问过。除非必要,否则我宁愿不使用 Transcripts;我觉得应该有更好的方法。
一些答案引用了Job
对象的ChildJobs
、Output
和Information
属性,但我很难理解如何使用它们,因为它们在我的简单测试中始终为空.
感谢您的宝贵时间。
已解决
感谢@Santiago Squarzon 和@Steven 提供两种不同的工作解决方案:
Remove-Job "test"
$script =
[PSCustomObject]@ "CoolProperty" = "CoolValue"
Write-Information "Returning a cool object"
Start-Job -Name "test" -ScriptBlock $script | Out-Null
$job = Get-Job -Name "test" -IncludeChildJob # Steven's solution
$job | Wait-Job | Out-Null
$info = $job.Information # Steven's solution
$result = Receive-Job -Name "test" -InformationVariable info2 # Santiago Squarzon's solution
Remove-Job -Name "test"
$result
"---"
$info
"---"
$info2
这使我可以分别捕获作业的输出和作业的信息流(两种不同的方式):
CoolProperty RunspaceId
------------ ----------
CoolValue f49c78bd-eda3-4c47-a6bc-d89a146618e9
---
Returning a cool object
---
Returning a cool object
【问题讨论】:
不完全确定您为什么要这样做,但为了回答您的问题,您需要将信息流重定向到标准输出。像这样:$job = Receive-Job -Name "test" 6>&1
这是我尝试过的解决方案之一(实际上是*>&1
),但问题是这会将输出流和信息流都发送到变量。我只想记录信息流,所以我正在寻找一种方法来分离信息流并记录它。诚然,我没有在我的代码中说清楚。
输出流是什么意思,您认为那里的 cmdlet 指向输出流?
我尝试更新问题以使其更清晰。将Receive-Job "test" 6>&1
的输出捕获到变量中会捕获作业输出流(即流#1)和作业信息流(#6)中作业的所有输出。我正在尝试单独捕获作业的信息流。如果我的命名法不准确,我深表歉意,我希望这是有道理的。
-InformationVariable
做对了,试试$result = Receive-Job -Name "test" -InformationVariable infoStream
。你会看到你的 PSCustomObject 存储在 $result
变量中,日志在 $infoStream
变量中:)
【参考方案1】:
不同的Streams分别存放在job对象中:
State : Completed
HasMoreData : True
StatusMessage :
Location : localhost
Command : Write-Information "something"
JobStateInfo : Completed
Finished : System.Threading.ManualResetEvent
InstanceId : ff5d1155-aca1-40fa-8e4e-dce6b87c709c
Id : 2
Name : test
ChildJobs : Job3
PSBeginTime : 4/2/2021 9:41:26 PM
PSEndTime : 4/2/2021 9:41:26 PM
PSJobTypeName : BackgroundJob
Output :
Error :
Progress :
Verbose :
Debug :
Warning :
Information :
注意子作业,但您可以通过以下方式获取信息流:
(Get-Job -Name test -IncludeChildJob).Information
在上面的示例中,它将返回“某物”,引用作业中的命令。
参考here 还有其他一些有用的信息。
【讨论】:
谢谢。一旦我的操作顺序正确,这就会起作用。我需要在收到工作之前捕获它,因为Receive-Job
删除了该数据。或者我想-Keep
参数也会起作用。以上是关于如何捕获作业的信息输出流?的主要内容,如果未能解决你的问题,请参考以下文章