Анализ PowerShell "Advance" для расчета времени установки компонентов на основе файла журнала - PullRequest
1 голос
/ 28 марта 2009

У меня есть приложение, которое создает файл журнала в следующем формате:

2009-03-27 15:30:50 Start
2009-03-27 15:30:51 Starting Component 1 Installation
2009-03-27 15:30:52 blah
2009-03-27 15:30:53 blah
2009-03-27 15:30:54 blah
2009-03-27 15:30:55 ~~~ Finished Component 1 Installation ~~~
2009-03-27 15:30:56 Starting Component 2 Installation
2009-03-27 15:30:57 blah
2009-03-27 15:30:58 blah
2009-03-27 15:30:59 blah
2009-03-27 15:30:60 ~~~ Finished Component 2 Installation ~~~
2009-03-27 15:30:61 Starting Component 3 Installation
2009-03-27 15:30:62 blah
2009-03-27 15:30:63 blah
2009-03-27 15:30:64 blah
2009-03-27 15:30:65 ~~~ Finished Component 3 Installation ~~~
2009-03-27 15:30:66 Finished

Полагаю, вы понимаете смысл формата.

Вещь, которую я хочу достичь, - это сценарий powershell, который будет возвращать таблицу результатов, показывающую

  1. Имя компонента
  2. Время начала
  3. Время окончания
  4. Время взято

Я называю это сценарием «продвижение», потому что он, вероятно, будет включать: синтаксический анализ, форматирование, создание новых объектов и т. Д.

  • Я новичок в PowerShell

1 Ответ

3 голосов
/ 28 марта 2009

Следующий скрипт может сделать это за вас ... ЕСЛИ вы прибегаете к разумным значениям времени ... более 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
        }
    }
}

но я нахожу его гораздо менее читабельным (не говоря уже о поддержке), чем первое решение. Это очень жестко связано с макетом файла журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...