【问题标题】:Powershell tail log to console while process is running进程运行时将 Powershell 尾部日志记录到控制台
【发布时间】:2016-09-22 13:48:08
【问题描述】:

我有一个将输出发送到日志文件的进程。我想编写一个 Powershell 脚本来启动这个过程,等待它完成,在它运行的同时,将它的日志文件实时跟踪到控制台。

我试过这个:

$procs = Start-Process "some_process.exe"
$logjob = Start-Job -Arg "some_logfile.log" -ScriptBlock {
    param($file)    
    Get-Content $file -wait | foreach { Write-Host($_) }
}
$procs | Wait-Process
$logjob | Stop-Job

... 和其他类似的安排,使用作业。但看起来作业的输出只有在作业停止后才可用,或者通过从中发送“事件”,这听起来好像它们并不是真正意味着快速的事情,比如日志消息(例如 100,000 行在约 1 分钟内)。

还有其他方法可以做到这一点吗?我的下一个选择是从Start-Process 调用“tail”,这样可以完成工作(我认为 - 希望这没有相同的“等待停止”输出行为),但感觉不对。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    除非您从作业中检索作业输出,否则不会显示作业输出。你为什么不简单地逆转你正在做的事情:将进程作为一项工作启动,并在控制台上跟踪日志文件:

    $job = Start-Job -ScriptBlock { & "some_process.exe" }
    Get-Content "some_logfile.log" -Wait
    

    如果您希望在进程终止时终止尾部,您可以将两者作为作业运行,并在另一个作业运行时从日志作业中检索输出:

    $pjob = Start-Job -ScriptBlock { & "some_process.exe" }
    $ljob = Start-Job -ScriptBlock { Get-Content "some_logfile.log" -Wait }
    
    while ($pjob.State -eq 'Running' -and $ljob.HasMoreData) {
      Receive-Job $ljob
      Start-Sleep -Milliseconds 200
    }
    Receive-Job $ljob
    
    Stop-Job $ljob
    
    Remove-Job $ljob
    Remove-Job $pjob
    

    【讨论】:

    • 我希望脚本在进程完成时完成 :( 据我所知,Get-Content -Wait 将等到 ctrl-c。
    • 这在 Powershell 2.0 上不起作用,因为 HasMoreData 没有通过 Receive-Job 清除。更多信息:stackoverflow.com/questions/10933732/…
    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多