在 Powershell 中配对数组元素

Pairing Array Elements in Powershell

我在 Powershell 3 脚本中有数组 $eventData,其中包含元素 TimeGeneratedmessage$eventData.message 应该首先在值 downup 之间交替,其次 $eventData[0].message 应该始终等于 down。如果此顺序相差两个连续的 0 或 1,或者如果 $eventData[0].message=up,我在计算时间跨度时会得到不正确的结果(在将这些结果发送到 MySQL 后完成)。如果不满足这两个条件中的任何一个,我想忽略该 $eventData.message 值并前进到下一次迭代,直到满足两个条件。

$eventPairs = @()
for ($e=0; $e -le $eventData.length; $e++)
  {
  if ($eventData[$e].message -eq "down")
    {
    $down2 = (Get-Date($eventData[$e].timegenerated) -format u)
    }
    ElseIf ($eventData[$e].message -eq "up")
    {
    $up2 = (Get-Date($eventData[$e].timegenerated) -Format u)
    }
  if($down2 -AND -$up2)
    {
    #we have both down and up values, lets pair them
    $eventPairs +=,@($down2,$up2)
    $down2 = $up2 = $null
    }
  } 

我考虑过 if eventData[e$]=0 -AND eventData.message -eq "up" then continue,但前两到三个迭代可能是 up 值,这也推翻了我对第二个标准的想法,即 even/odd 测试(因为 $e=[1]=odd 那么 eventData.message 应该等于 up,否则 continue)。

我很难过。我怎样才能最好地实现这一目标?

我认为这可能会简化为这样的事情:

$eventPairs = 
$eventdata |
  foreach {
  if ($_.message -eq "down")
   { $eventPair = @(Get-Date($_.timegenerated) -format u) }

  ElseIf (($_.message -eq "up") -and ($eventPair.count -eq 1))
  { 
    $eventPair += @(Get-Date($_.timegenerated) -format u)
    $eventPair
  }
}

每个 "down" 事件将开始一个新的事件对,这将由下一个 "up" 事件完成。额外的 "up" 事件将被忽略,因为该对已经完成,因此它的计数将大于 1。早期的 "up" 事件将被忽略,因为没有启动事件的向下事件对了。