2013-04-16 49 views
1

我需要輸出幾個日誌文件 - 當它們被寫入到shell時。等效於tail -f output worker * .log在Powershell中

在我的腳本的unix版本中,這是通過tail -f output\worker*.log實現的。 請注意通配符。

在Powershell中,我試過Get-Content -Path "output\worker*.log" -Wait,但是這隻能打印它能找到的第一個日誌文件。

完成,這裏是我的代碼,我打電話給我的方案:

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中?

回答

0

您可以通過直接從子作業的輸出緩衝區讀取輸出流來複制輸出流。

這裏是一個演示腳本。請注意,對於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!"