如何从Powershell作业捕获.NET跟踪输出?

Jac*_*eja 7 powershell trace powershell-jobs

我使用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")
Run Code Online (Sandbox Code Playgroud)

但是如果我在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
Run Code Online (Sandbox Code Playgroud)

Joe*_*orn -1

目前尚不清楚您希望捕获的输出去往何处。到目前为止,大部分讨论都是围绕控制台展开的,但由于您称其为“作业”(我想您的意思是计划任务),所以我不太确定控制台是最好的地方。你永远不会看到结果。日志文件听起来更合适。如果是这种情况,您应该创建一个TextWriteTraceLister。这将允许您为结果设置一个日志文件。

此外,.Net 中的跟踪的一大优点是您可以附加多个侦听器。因此,如果您想在运行时查看输出,您还可以附加 ConsoleTraceListener,并且它不会干扰写入日志文件。

最后,还可以编写自己的 TraceListener。这对于写入日志数据库或 Web 服务之类的事情很有用。要在 PowerShell 中使用您自己的 TraceListener,您需要使用 .Net 语言构建侦听器,该语言可以编译为类库程序集 (dll),然后将其部署到 GAC 以在您的项目中使用。