2016-09-13 130 views
1

我的目標是編寫一個腳本,用於檢查事件持續時間的日誌文件,根據日誌條目計算持續時間(開始/結束),然後計算這些持續時間的平均值最近24小時,並確定它是否大於某個值(例如,讓我們使用2小時)。到目前爲止,我已經完成了前兩個部分,正在適當檢查日誌並計算每個適用日誌的持續時間。我只是不知道從最後一步開始,所有日誌的持續時間平均。以下是我的代碼到目前爲止。ForEach循環,試圖計算平均值

$imagesuccess = Get-ChildItem '\\server\osd_logs\success' -Directory | 
    Where-Object { 
     ($_.Name -like "P0*") -or (($_.Name -like "MININT*") -and 
     (Test-Path "$($_.FullName)\SCCM_C\Logs\SMSTSLog\Get-PSPName.log")) -and 
     ($_.LastWriteTime -gt (Get-Date).AddHours(-24)) 
    } 

$sccmlogpaths = "\\s0319p60\osd_logs\success\$($imagesuccess)\SCCM_C\Logs\SMSTSLog\smsts.log" 

foreach ($sccmlogpath in $sccmlogpaths) { 
    $imagestartline = Select-String -Pattern "<![LOG[New time:" -Path $sccmlogpath -SimpleMatch 
    $imagestarttime = $imagestartline.ToString().Substring(75, 8) 

    $imagefinishline = Select-String -Pattern "<![LOG[ Directory: M:\$($imagesuccess)" -Path $sccmlogpath -SimpleMatch 
    $imagefinishtime = $imagefinishline.ToString().Substring(71, 8) 

    $imageduration = New-TimeSpan $imagestarttime $imagefinishtime 
    $imagedurationstring = $imageduration.ToString() 
} 

回答

1

粗略你應該這樣做:

$durations = foreach ($sccmlogpath in $sccmlogpaths) { 
    # [snip] 

    $imageduration = New-TimeSpan $imagestarttime $imagefinishtime 

    $imageduration # the 'output' of the foreach() {} 
} 


# $durations is now an array of timespans 

$measurements = $durations | Measure-Object -Average -Property TotalHours 
$averageHours = $measurements.Average 

if (2.5 -lt $averageHours) { 
    # code here 
} 

這確實總和(N)/數(n)的平均。

注意:如果您查詢最近24小時,如果任何一個持續時間跨越午夜,New-TimeSpan將無法正常工作;它會將23:01 - > 00:01看作-23小時。

+0

@RyanBemrose是的!總的錯誤,感謝你接受它。 (我已經編輯來糾正它)。 – TessellatingHeckler

+0

令人敬畏的方法!我喜歡使用數組,我只是在從哪裏開始畫空白。我喜歡這種方法。有一個問題,我想我可能會遇到一些問題,其格式是我的工期。現在他們是HH:MM:SS,我想盡量保持這種狀態。平均法可以很好地發揮作用嗎? – LilithGoddess

+0

@LilithGoddess數組包含PowerShell'[TimeSpan]'對象,它們獨立於您使用的字符串格式。 –