相当于Powershell中的tail -f output \ worker * .log

时间:2013-04-16 14:58:24

标签: powershell tail

我需要输出几个日志文件 - 当它们被写入 - 时。

在我的脚本的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中打印它?

1 个答案:

答案 0 :(得分:0)

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

这是一个演示脚本。请注意,对于详细输出,我正在读取缓冲区中的输出,以便在后续读取时不会重新显示。这似乎对作业的“接收作业”缓冲区没有任何影响。如果在脚本完成后对其执行接收作业,您仍将再次获得详细输出。

$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!"