Найти разницу дат между определенными полями в powershell - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть следующий пользовательский объект 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_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

Мне нужна помощь, чтобы сделать что-то сложное, массив отсортирован со временем, мне нужна логика c, которая начинается с конца В массиве найдите 1-й экземпляр Типа события Agent_connected / Agent_reconnected, при обнаружении которого он проверяет следующий элемент в массиве, проверяет, соответствует ли тип события agent_disconnected, если он соответствует тогда - проверяет следующий элемент и проверяет, является ли тип события Agent_Reconnnected / Agent_connected - если это так - тогда найдите разницу между временем события agent_disconnected и этой датой Agent_reconnected / agent подключенного, в основном, если в любое время в массиве после подключенного события обнаруживается связанный / повторно подключенный тип события, тогда нам нужно найдите разницу во времени между этими событиями.

пример - этот массив содержит 25 объектов

$ obj [24] = 3/31/2020 1:15:02 PM 31/03 / 2020 AGENT_CONNECTED, когда агент впервые подключается / отключается, если да мы видим следующий элемент

$ obj [23] = 31.03.2020 11:50:52 31/03/2020 AGENT_DISCONNECTED мы видим, что видим событие отключения, что означает, что мы проверяем следующий элемент если это событие подключения / переподключения агента

и мы видим, что $ obj 22 удовлетворяет этому условию $ obj [22] = 31.03.2020 23:38:21 31.03.2020 AGENT_RECONNECTED

и мы получаем diff как $ obj [23] .time - $ obj [22] .time, теперь мы снова go возвращаемся и видим то же условие для остальных элементов в массиве - оцениваем три вышеуказанных условия и найди разницу во времени.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Это не означает, что 0-й индекс является «Connect / Reconnect» - если это так, он выдаст исключение из-за отсутствия чего-либо перед ним.

    $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 
0 голосов
/ 06 апреля 2020

Если $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 только для случаев, когда несколько (повторных) соединений происходят подряд. В этом случае мы только вычитаем первый (повторно) экземпляр подключения.

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