PowerShell如何将Receive-Job命令的输出保存到变量或文件中而非显示在屏幕上?

5

我想获取工作详细信息,但不希望将数据输出到屏幕。无论我尝试哪个选项,作业日志总是发送到控制台。有没有办法在不输出到控制台的情况下将日志保存在变量或文件中?

Receive-Job -Id $id -Keep -ErrorAction Continue > C:\Temp\Transcript-$VM.txt

$info = Receive-Job -Id $id -Keep -ErrorAction Continue

1
作业必须在脚本块中有一个 Write-HostOut-Host 语句。如果有的话,您应该将其删除。如果您使用 PowerShell v5 或更高版本,则还可以在脚本块中设置 $InformationPreference 变量为 'Ignore',但这可能会产生意想不到的后果。-InformationAction 'Ignore'Write-Host 上执行相同的操作,但只针对特定命令,并且不影响环境设置。 - AdminOfThings
这个任务中确实包含了 Write-Host 命令,当运行 Receive-Job 命令并将其输出到屏幕上时,可以看到这些命令。 - Pie
我尝试了所有的$InformationPreference选项('Ignore'不在其中),请参考下面的链接,但它仍然会在屏幕上显示内容或完全停止脚本。 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-6 - Pie
你的PowerShell版本是什么? - AdminOfThings
PSVersion:5.1.18362.145 - Pie
显示剩余2条评论
2个回答

4

您提到您的工作使用Write-Host输出,并且您正在运行Windows PowerShell v5.1。

为了还能够捕获Write-Host输出 - 在v5+中将被发送到信息流(流号为6 - 请使用重定向 6>&1

# Capture both success output and information-stream output
# (Write-Host) output in $info.
$info = Receive-Job -Id $id -Keep -ErrorAction Continue 6>&1

很不幸的是,由于已知的 错误,即使在PowerShell Core 7.0.0-preview.5中该错误仍然存在,您仍将得到控制台输出的

捕获所有重定向*>&1通常通过成功输出流路由所有流。

很不幸,由于上面链接的错误,使用后台作业远程时以下流不能被完全捕获或重定向:

  • 详细信息(4
  • 调试消息(5

唯一的解决方法是在作业内部捕获流并将其保存到文件,然后稍后从调用者中访问这些文件
当然,这需要您对作业的创建方式有控制权。

一个简化的例子:

# Redirect all output streams *inside* the job to a file...
Start-Job { 
 & { 
   # The job's commands go here.
   # Note that for any *verbose* output to be captured,
   # verbose output must explicitly turned on, such as with
   # the -Verbose common parameter here.
   # You can also set $VerbosePreference = 'Continue', which 
   # cmdlets (including advanced functions/scripts) will honor.
   'success'; write-verbose -Verbose 'verbose'; write-host 'host' 
 } *> $HOME/out.txt 
} | Receive-Job -Wait -AutoRemove
# ... then read the resulting file.
Get-Content $HOME/out.txt

请注意,我使用了完整路径作为重定向目标,因为不幸的是,在 PowerShell v6- 版本中,后台作业中执行的脚本块不会继承调用者的当前位置。这将在 PowerShell Core v7.0 中更改。

-1
尝试将其放入管道中,看看是否有效:
Receive-Job -Id $id -Keep -ErrorAction Continue | Set-Content 'C:\Temp\Transcript-$VM.txt'

输出文件中的内容如下。同时在屏幕上显示日志。Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels.PSResourceGroupDeployment Microsoft.Azure.Commands.Compute.Models.PSComputeLongRunningOperation Microsoft.Azure.Commands.Compute.Models.PSComputeLongRunningOperation - Pie
这份错误报告解释了为什么那样做没有帮助。 - mklement0
另外,> 在幕后确实涉及到管道;它就像隐式使用了 | Out-File,因此你所建议的基本上不会产生差异。 - mklement0
我误解了问题。我以为他试图隐藏作业对象的实际输出并将其发送到文件,而不是收集作业的DataStream的输出。 - Jacob Kucinic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接