【发布时间】:2012-08-12 00:17:40
【问题描述】:
我有一组正在运行的作业。当他们完成后,我使用接收作业并将输出写入屏幕。我想获取该输出并将其记录到文件中。我不想在作业运行时输出产生的输出,因为一次运行多个作业时会穿插日志记录。找工作 | Receive-Job 以井井有条的方式打印输出。
我已经尝试了以下所有方法,但没有将输出写入文件或存储在变量中,它只是进入屏幕:
#Wait for last job to complete
While (Get-Job -State "Running") {
Log "Running..." -v $info
Start-Sleep 10
}
Log ("Jobs Completed. Output:") -v $info
# Getting the information back from the jobs
foreach($job in Get-Job){
Receive-Job -Job $job | Out-File c:\Test.log -Append
$output = Receive-Job -Job $job
Log ("OUTPUT: "+$output)
Receive-Job -Job $job -OutVariable $foo
Log ("FOO: "+$foo)
}
编辑: 在看到 Keith 的评论后,我已将 foreach 中额外的 Receive-Job 调用删除到以下内容:
# Getting the information back from the jobs
foreach($job in Get-Job){
Receive-Job -Job $job -OutVariable temp
Write-Host ("Temp: "+$temp)
$temp | Out-File -FilePath c:\Test.log -Append
}
我还确认我没有在脚本的其他任何地方使用 Receive-Job。但是写入主机 $temp 和输出文件仍然不产生任何输出。
【问题讨论】:
-
这是一个很好的问题。正如您在下面提到的,Write-Output 没有帮助,因为它会干扰函数调用返回的内容。我认为 Write-Verbose 可能会很有帮助,因为您可以在作业的子作业的 Verbose 字段上执行 ReadAll,但只有在设置了 VerbosePreference 时才会填充它,这意味着它也会显示在输出中。我真的认为我们需要修复这个错误:github.com/PowerShell/PowerShell/issues/3130
-
见@Spongebob 下面的代码答案。它使您可以轻松地将子作业的 Write-Host 的输出转换为变量,这很棒。我在工作中将此与 Start-Transcript/Stop-Transcript 结合使用。然后我得到了每个作业的日志,但是每个作业的日志都可以通过每个 Receive-Job 进行检查。仍然存在您的顶级控制台被子作业的 Write-Host 调用污染的问题,但我在这里看到的没有解决方案可以解决这个问题。
标签: powershell jobs