Следующий скрипт может сделать это за вас ... ЕСЛИ вы прибегаете к разумным значениям времени ... более 60 секунд в минуту странны (и дали мне несколько исключений, которые вызвали головные боли при разборе даты / времени, пока я не заметил, почему были выброшены исключения ...)
$logfile = $args[0]
$log = get-content $logfile
$Components = @()
switch -regex ($log) {
"(.*) Starting (.*) Installation" {
$c = New-Object PSObject
$st = [DateTime]::ParseExact($Matches[1], "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
$c | Add-Member -Type NoteProperty -Name Component -Value $Matches[2]
$c | Add-Member -Type NoteProperty -Name StartTime -Value $st
}
"(.*) ~~~ Finished" {
$et = [DateTime]::ParseExact($Matches[1], "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
$c | Add-Member -Type NoteProperty -Name EndTime -Value $et
$c | Add-Member -Type NoteProperty -Name TimeTaken -Value ($c.EndTime - $c.StartTime)
$Components += $c
}
}
$Components
Я мог бы немного сократить время выполнения (примерно на 25 процентов) с помощью следующего кода:
$logfile = $args[0]
foreach ($l in Get-Content $logfile) {
if ($l.Length -ge 30) {
if ($l.Substring(20,8) -eq "Starting") {
$c = New-Object PSObject
$st = [DateTime]::ParseExact($l.Substring(0,19), "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
$c | Add-Member -Type NoteProperty -Name Component -Value $l.Substring(29, $l.Length - 42)
$c | Add-Member -Type NoteProperty -Name StartTime -Value $st
} elseif ($l.Substring(24,8) -eq "Finished") {
$et = [DateTime]::ParseExact($l.Substring(0,19), "yyyy'-'MM'-'dd HH':'mm':'ss", $null)
$c | Add-Member -Type NoteProperty -Name EndTime -Value $et
$c | Add-Member -Type NoteProperty -Name TimeTaken -Value ($c.EndTime - $c.StartTime)
$c
}
}
}
но я нахожу его гораздо менее читабельным (не говоря уже о поддержке), чем первое решение. Это очень жестко связано с макетом файла журнала.