我有带数据的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处于活动状态(运行)的时间。 您能指出应该使用哪种方法来计算这种差异吗?
答案 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--
}