【发布时间】:2015-03-26 05:25:49
【问题描述】:
我在 Powershell 中使用 .NET 组件,它使用 Trace.TraceWarning、Trace.TraceInformation 等。
我想在运行我的 Powershell 脚本时将这些跟踪输出到控制台。
这在我在当前会话中使用组件时有效。例如(模拟跟踪的效果)给我 'Hello' 输出到控制台:
$listener = new-object "system.diagnostics.consoletracelistener"
[System.Diagnostics.Trace]::Listeners.Add($listener) | Out-Null
[System.Diagnostics.Trace]::TraceInformation("Hello")
但是,如果我在 Powershell 作业中执行相同的操作,我将不会得到任何输出,即使 ConsoleTraceListener 应该写入 STDOUT,而我预计会被作业捕获。 (有趣的是,Console.WriteLine 也不能在工作中工作 - 但 Write-Host 可以)。
我的工作是这样开始的:
$work = {
$listener = new-object "system.diagnostics.consoletracelistener"
[System.Diagnostics.Trace]::Listeners.Add($listener) | Out-Null
[System.Diagnostics.Trace]::TraceInformation("Hello")
}
$job = Start-Job -RunAs32 -ScriptBlock $work
$job | Receive-Job -Wait
【问题讨论】:
-
ConsoleTraceListener 写入控制台,因此相关:serverfault.com/questions/399854/powershell-start-job-output
-
ConsoleTraceListener 似乎正在写入标准输出 referencesource.microsoft.com/#System/compmod/system/…。但是由于某些原因,它没有被选中
-
经过更多测试后,我发现了一些关于工作和子工作的有趣的事情。我认为最终的问题是 powershell 没有使用 System.Console 类,而是使用自定义 System.Management.Automation.Host.PSHost 类并重定向流。不过,在像您这样的某些边缘情况下,这似乎并没有按预期实现。
-
ConsoleTraceListener 只是使用 STDOUT。不知道我看到它是一个边缘案例!
标签: powershell trace powershell-jobs