1

我需要将几个日志文件(在写入时)输出到 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.log, output\worker02.log, output\worker03.log, output\worker04.log, output\worker05.log, output\worker06.log, output\worker07.log, output\worker08.log

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

4

1 回答 1

0

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

这是一个演示脚本。请注意,对于 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-04-16T15:47:37.840 回答