Рассчитать разницу между записями в столбце CSV с помощью PowerShell - PullRequest
1 голос
/ 30 октября 2019

У меня есть CSV-файл с данными (пример ниже):

+----------+----------+-------------------------------+
|   Name   |  Status  |             Time              |
+----------+----------+-------------------------------+
| Service1 | Running  | "2019/10/20 07:49:40,836 GMT" |
| Service1 | Shutdown | "2019/10/15 20:07:45,021 GMT" |
| Service1 | Running  | "2019/10/10 20:07:45,021 GMT" |
+----------+----------+-------------------------------+

С этим значением мне нужно вычислить, как долго данное имя находилось в рабочем состоянии за последние 30 дней. Это не вопрос вычисления с одной записью в файле, но у данного имени может быть любое количество вхождений в имени столбца. Приведенный выше пример является простым примером, имя Service1 2019/10/10 было запущено, но 2019/10/15 было выключено, поэтому между этим два раза не было активности. Следующее активное время наступает 10 октября 2019 г. и с этого времени до текущей даты. Теперь я хотел бы подсчитать, как долго в течение последних 30 дней Service1 находился в активном состоянии (работает). Не могли бы вы указать, какой метод следует использовать для расчета этой разницы?

1 Ответ

0 голосов
/ 30 октября 2019

Попробуйте это:

$records = Import-CSV -Path 'D:\service.csv' -Delimiter (Get-Culture).TextInfo.ListSeparator | select -Property @{n='Time';e={[datetime]::parseexact($_.Time.Replace('"',''),"yyyy/MM/dd HH:mm:ss,fff GMT",$null)}},* -Exclude 'Time' | Sort-Object -Property Name, Time

$completeTimeSpan = 30 * 24 * 60 * 60
$currentDateTime  = Get-Date

for( $i = 0; $i -lt $records.Count; $i++ ) {

    $serviceName   = $records[$i].Name
    $opStatus      = 3  # 0 = down, 1 = up, 3 = start
    $upTime        = 0
    $downTime      = 0
    $dateLastEvent = $null

    while( $i -lt $records.Count -and $serviceName -eq $records[$i].Name ) {

        $ts = New-TimeSpan -Start $records[$i].Time -End $currentDateTime

        if( $ts.Days -le 30 ) {

            if( $opStatus -eq 1 ) {
                $ts        = New-TimeSpan -Start $dateLastEvent -End $records[$i].Time
                $uptime   += $ts.TotalSeconds
                if( $records[$i].Status -eq 'Shutdown' ) {
                    $opStatus = 0
                }
            }
            elseif( $opStatus -eq 0 )  {
                $ts        = New-TimeSpan -Start $dateLastEvent -End $records[$i].Time
                $downtime += $ts.TotalSeconds
                if( $records[$i].Status -eq 'Running' ) {
                    $opStatus = 1
                }
            }
            elseif( $opStatus -eq 3 ) {
                if( $records[$i].Status -eq 'Shutdown' ) {
                    $opStatus = 0
                }
                else {
                    $opStatus = 1
                }
                $dateLastEvent = $records[$i].Time
            }
        }

        $i++
        if( $i -eq $records.Count -or $serviceName -ne $records[$i].Name ) {
            "Service: $servicename Uptime: $upTime $(($uptime / $completeTimeSpan))% DownTime: $downTime $(($downtime / $completeTimeSpan))%"
            if( $i -lt $records.Count ) {
                $serviceName = $records[$i].Name
            }
        }
    }
    $i--

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