我需要输出几个日志文件 - 当它们被写入 - 时。
在我的脚本的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
)
是否有解决方法来输出所有这些日志文件?或者是否可以从后台进程复制stdout流以在shell中打印它?
答案 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!"