查找powershell中某些字段之间的日期差异
我有下面的PS自定义对象查找powershell中某些字段之间的日期差异,powershell,Powershell,我有下面的PS自定义对象 Time DateFormat Event Type ---- ---------- ---------- 3/31/2020 11:59:35 PM 31/03/2020 AGENT_RECONNECTED 3/31/2020 4:01:56 PM 31/03/2020 AGENT_DISCONNECTED 3/31/2020 4:14:19 PM 31/03/2020 AGENT_CONNECT
Time DateFormat Event Type
---- ---------- ----------
3/31/2020 11:59:35 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 4:01:56 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 4:14:19 PM 31/03/2020 AGENT_CONNECTED
3/31/2020 4:24:12 PM 31/03/2020 AGENT_CONNECTED
3/31/2020 4:30:31 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 4:36:08 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 5:12:49 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 6:25:39 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 7:09:08 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 7:38:53 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 7:44:44 PM 31/03/2020 AGENT_CONNECTED
3/31/2020 8:23:48 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 9:33:36 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 9:35:58 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 10:46:54 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 10:50:54 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 10:53:10 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 11:05:56 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 11:13:47 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 11:32:41 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 11:34:27 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 11:35:55 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 11:38:21 PM 31/03/2020 AGENT_RECONNECTED
3/31/2020 11:50:52 PM 31/03/2020 AGENT_DISCONNECTED
3/31/2020 1:15:02 PM 31/03/2020 AGENT_CONNECTED
3/31/2020 1:04:17 PM 31/03/2020 AGENT_DISCONNECTED
我需要一个帮助来完成一些复杂的事情,数组是按时间排序的,我需要一个逻辑,它将从数组的末尾开始,找到事件类型Agent\u connected/Agent\u reconnected的第一个实例,当遇到它时,检查数组中的下一项,查看事件类型是否与Agent\u disconnected匹配,如果匹配,则-检查下一项,查看事件类型是否为“代理重新连接/代理已连接”-如果是-则查找代理已断开连接事件的时间与此代理重新连接/代理已连接日期之间的差异,基本上,如果在断开连接的事件之后阵列中遇到连接/重新连接的事件类型,那么我们需要找出这些事件之间的时间差
例如,此数组有25个对象
$obj[24]=2020年3月31日下午1:15:02 2020年3月31日代理已连接
这是第一次看到代理连接/断开连接,如果是,我们将看到下一个元素
$obj[23]=2020年3月31日11:50:52下午31/03/2020代理已断开
我们看到一个断开连接事件,这意味着我们检查下一个元素是否是代理连接/重新连接事件
我们看到$obj 22满足这个条件
$obj[22]=2020年3月31日晚上11:38:21 2020年3月31日代理重新连接
我们得到的差异为$obj[23]。时间-$obj[22]。时间,现在我们再次返回并看到数组中其余元素的相同条件-计算上述三个条件并找出时间上的差异。如果
$obj
是一个带有帖子中属性的自定义对象数组,则可以执行以下操作:
$obj | Sort {[datetime]$_.Time} | Foreach-Object {
if ($_.'Event Type' -eq 'AGENT_DISCONNECTED') {
$disc = [datetime]$_.Time
}
else {
$con = [datetime]$_.Time
if ($disc) {
"Agent connected at $($_.Time) after being disconnected for $($con - $disc)"
$disc = $null
}
}
}
将
Time
转换为[datetime]
对象时,对数组执行排序。然后将当前(重新)连接的时间对象与先前断开连接的时间对象相减。$disc=$null
仅适用于一行中发生多个(重新)连接的情况。在这种情况下,我们只减去第一个(重新)连接实例 这并不说明第0个索引是“连接/重新连接”——如果是,它将抛出异常,因为之前没有任何内容
$t = (@"
Time, DateFormat, "Event Type"
3/31/2020 11:59:35 PM,31/03/2020, AGENT_RECONNECTED
3/31/2020 4:01:56 PM, 31/03/2020, AGENT_DISCONNECTED
3/31/2020 4:14:19 PM, 31/03/2020, AGENT_CONNECTED
3/31/2020 4:24:12 PM, 31/03/2020, AGENT_CONNECTED
3/31/2020 4:30:31 PM, 31/03/2020, AGENT_DISCONNECTED
3/31/2020 4:36:08 PM, 31/03/2020, AGENT_RECONNECTED
3/31/2020 5:12:49 PM, 31/03/2020, AGENT_DISCONNECTED
3/31/2020 6:25:39 PM, 31/03/2020, AGENT_RECONNECTED
3/31/2020 7:09:08 PM, 31/03/2020, AGENT_DISCONNECTED
3/31/2020 7:38:53 PM, 31/03/2020, AGENT_RECONNECTED
3/31/2020 7:44:44 PM, 31/03/2020, AGENT_CONNECTED
3/31/2020 8:23:48 PM, 31/03/2020, AGENT_DISCONNECTED
3/31/2020 9:33:36 PM, 31/03/2020, AGENT_RECONNECTED
3/31/2020 9:35:58 PM, 31/03/2020, AGENT_DISCONNECTED
3/31/2020 10:46:54 PM,31/03/2020, AGENT_RECONNECTED
3/31/2020 10:50:54 PM,31/03/2020, AGENT_DISCONNECTED
3/31/2020 10:53:10 PM,31/03/2020, AGENT_RECONNECTED
3/31/2020 11:05:56 PM,31/03/2020, AGENT_DISCONNECTED
3/31/2020 11:13:47 PM,31/03/2020, AGENT_RECONNECTED
3/31/2020 11:32:41 PM,31/03/2020, AGENT_DISCONNECTED
3/31/2020 11:34:27 PM,31/03/2020, AGENT_RECONNECTED
3/31/2020 11:35:55 PM,31/03/2020, AGENT_DISCONNECTED
3/31/2020 11:38:21 PM,31/03/2020, AGENT_RECONNECTED
3/31/2020 11:50:52 PM,31/03/2020, AGENT_DISCONNECTED
3/31/2020 1:15:02 PM, 31/03/2020, AGENT_CONNECTED
3/31/2020 1:04:17 PM, 31/03/2020, AGENT_DISCONNECTED
"@) | ConvertFrom-Csv
$o = for ($i = $t.Count; $i -gt 0; $i--) {
if ($t[$i].'Event Type' -match 'AGENT_CONNECTED|AGENT_RECONNECTED') {
if ($t[$i-1].'Event Type' -match 'AGENT_DISCONNECTED') {
if ($t[$i-2].'Event Type' -match 'AGENT_CONNECTED|AGENT_RECONNECTED') {
[pscustomobject]@{
'InitiatingIdx' = $i
'InitiatingDtm' = (Get-Date $t[$i].Time)
'DisconnectIdx' = $i-1
'DisconnectDtm' = (Get-Date $t[$i-1].Time)
'ReconnectIdx' = $i-2
'ReconnectDtm' = (Get-Date $t[$i-2].Time)
'DeltaMins' = "{0:N2}" -f ((Get-Date $t[$i-1].Time) - (Get-Date $t[$i-2].Time)).TotalMinutes
}
}
}
}
}
$o | ft
InitiatingIdx InitiatingDtm DisconnectIdx DisconnectDtm ReconnectIdx ReconnectDtm DeltaMins
------------- ------------- ------------- ------------- ------------ ------------ ---------
24 3/31/2020 1:15:02 PM 23 3/31/2020 11:50:52 PM 22 3/31/2020 11:38:21 PM 12.52
22 3/31/2020 11:38:21 PM 21 3/31/2020 11:35:55 PM 20 3/31/2020 11:34:27 PM 1.47
20 3/31/2020 11:34:27 PM 19 3/31/2020 11:32:41 PM 18 3/31/2020 11:13:47 PM 18.90
18 3/31/2020 11:13:47 PM 17 3/31/2020 11:05:56 PM 16 3/31/2020 10:53:10 PM 12.77
16 3/31/2020 10:53:10 PM 15 3/31/2020 10:50:54 PM 14 3/31/2020 10:46:54 PM 4.00
14 3/31/2020 10:46:54 PM 13 3/31/2020 9:35:58 PM 12 3/31/2020 9:33:36 PM 2.37
12 3/31/2020 9:33:36 PM 11 3/31/2020 8:23:48 PM 10 3/31/2020 7:44:44 PM 39.07
9 3/31/2020 7:38:53 PM 8 3/31/2020 7:09:08 PM 7 3/31/2020 6:25:39 PM 43.48
7 3/31/2020 6:25:39 PM 6 3/31/2020 5:12:49 PM 5 3/31/2020 4:36:08 PM 36.68
5 3/31/2020 4:36:08 PM 4 3/31/2020 4:30:31 PM 3 3/31/2020 4:24:12 PM 6.32
2 3/31/2020 4:14:19 PM 1 3/31/2020 4:01:56 PM 0 3/31/2020 11:59:35 PM -477.65