使用PowerShell计算csv列中条目之间的差异

时间:2019-10-30 09:29:44

标签: powershell

我有带数据的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已关闭,因此两次beetwen均未激活。 下一个活动时间发生在2019/10/20,从这个时间到当前日期是活动的。 现在,我要计算过去30天Service1处于活动状态(运行)的时间。 您能指出应该使用哪种方法来计算这种差异吗?

1 个答案:

答案 0 :(得分:0)

尝试这个:

$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--

}