我有一个csv输入文件,如:
日期;时间; PC;状态
2017年1月25日; 10:30:57; PC1;非活性
2017年1月25日; 10:35:57; PC2;活性
2017年1月25日; 10:37:34; PC1;活性
2017年1月25日; 10:38:35; PC3;非活性
2017年1月25日; 10:39:20; PC1;非活性
2017年1月25日; 10:42:10; PC2;非活性
2017年1月25日; 10:42:10; PC3;活性
所以,我需要只显示最后一次重复非活动状态,并显示时间和当前时间之间的差异。 结果必须是:
pc1从10:39:20不活动
pc2从10:42:10不活动
不知道如何在powershell中实现它。需要帮助:)
答案 0 :(得分:1)
现在,您只需通过Write-Host
输出它,但您应该可以重建它以处理您想要的数据:
$csv = import-csv .\test.csv -Delimiter ";"
$pcs = $csv.pc | select -Unique
foreach($pc in $pcs) {
#get all entries for current pc and order by date/time, then select newest entry
$le = $csv | where {$_.pc -eq $pc} | sort date,time -Descending | select -First 1
#if last state is inactive
if($le.state -eq "inactive"){
$writedate = get-date -Date $le.date -Hour $le.time.Substring(0,2) -Minute $le.time.Substring(3,2) -Second $le.time.Substring(6,2)
$td = (get-date) - $writedate
write-host "time difference for $pc : $($td.Days) days $($td.Hours) hours, $($td.Minutes) minutes, $($td.Seconds) seconds"
}
}
如果您的时间字段不是HH:MM:DD,那么您将不得不更改脚本以适应
答案 1 :(得分:0)
两个解决方案,一个简短的解决方案:
$csv = import-csv .\SO_41941150.csv -Delimiter ";"
$csv|group pc|%{$_.group|select -last 1|? state -eq 'inactive'|%{"$($_.pc) inactive from $($_.time)"}}
准确输出:
pc1 inactive from 10:39:20
pc2 inactive from 10:42:10
使用:: ParseExact将日期和时间转换为日期时间的较长时间,并将结果显示为经过的TotalSeconds / Minutes。
$csv = import-csv .\SO_41941150.csv -Delimiter ";"
$csv | Group-Object pc | Foreach-Object {
$_.Group | Select-Object -last 1 | Where-Object state -eq 'inactive'|
ForEach-Object {
$DT = [datetime]::ParseExact("$($_.date) $($_.time)","dd.MM.yyyy HH:mm:ss",$null)
$Secs = [int]((get-date) - $DT).TotalSeconds
$mins = [int]((get-date) - $DT).TotalMinutes
"$($_.pc) inactive since $Mins minutes or $Secs seconds"
}
}
输出:
pc1 inactive since 9160 minutes or 549578 seconds
pc2 inactive since 9157 minutes or 549408 seconds