【问题标题】:Equivalent for tail -f output\worker*.log in Powershell等效于 Powershell 中的 tail -f output\worker*.log
【发布时间】:2013-04-16 14:58:24
【问题描述】:

我需要将几个日志文件(在写入时)输出到 shell。

在我的脚本的 unix 版本中,这是由 tail -f output\worker*.log 实现的。 注意通配符。

在 Powershell 中我尝试了Get-Content -Path "output\worker*.log" -Wait,但这只会将它可以找到的第一个日志文件打印到 shell。

为了完成,这是我调用我的程序的代码:

foreach ($worker in $workers)
{
  Write-Host "  Start $worker in background"

  $block = {& $args[0] $args[1] $args[2] $args[3] $args[4] $args[5] $args[6] 2> $args[7] > $args[8]}
  start-job -name $worker -scriptblock $block -argumentlist `
    "$strPath\worker\bin\win32\php.exe", `
    "-q", `
    "-c", `
    "$strPath\worker\conf\php_win32.ini", `
    "$strPath\worker\bin\os-independant\logfilefilter\logfilefilter.php", `
    "-f", `
    "$strPath\worker\$worker\conf\logfilefilter-$worker.xml", `
    "$strPath\output\$worker-error.log", `
    "$strPath\output\$worker.log"
}

Get-Content -Path "output\worker*.log" -Wait

在我的测试用例中,有 8 个工作人员和日志文件(output\worker01.logoutput\worker02.logoutput\worker03.logoutput\worker04.logoutput\worker05.logoutput\worker06.logoutput\worker07.logoutput\worker08.log

是否有解决方法来输出所有这些日志文件?或者是否可以从后台进程复制 stdout 流以在 shell 中打印?

【问题讨论】:

    标签: powershell tail


    【解决方案1】:

    您可以通过直接从子作业的输出缓冲区读取输出流来复制它们。

    这是一个演示脚本。请注意,对于 Verbose 输出,我会在读取缓冲区时从缓冲区中删除输出,这样它就不会在后续读取时重新显示。这似乎对作业的接收作业缓冲区没有任何影响。如果您在脚本完成后对其执行 Receive Job,您仍会再次获得 Verbose 输出。

    $sb = {
    $VerbosePreference = 'Continue'
    for ($i = 1; $i -le 100; $i++ )
    {
      start-sleep -Milliseconds 150
      Write-Verbose "$(get-date)"
      write-progress -activity "Search in Progress" -status "$i% Complete:" -percentcomplete $i;}
    }
    
    $job = start-job -ScriptBlock $sb 
    $verbose = ($job.ChildJobs[0].Verbose)
    
    While ($job.State -ne 'Completed')
    {
      $job.ChildJobs |
       foreach {
       Start-Sleep -seconds 1
       $Pct_Complete = $_.Progress | select -last 1 | select -ExpandProperty PercentComplete
       Write-Host "`rBackground job $($_.ID) is $Pct_Complete percent completed." -ForegroundColor Cyan 
         While ($verbose.count){
          Write-Host $verbose[0] -ForegroundColor Gray
          $verbose.removeat(0)}
          }
    
    }
    write-host "`nDone!"
    

    【讨论】:

      猜你喜欢
      • 2013-02-18
      • 1970-01-01
      • 2010-12-14
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 2020-11-19
      • 2018-06-09
      相关资源
      最近更新 更多