Foreach with Where-Object 没有产生正确的结果

Foreach with Where-Object not yielding correct results

我有以下代码:

               $ErrCodes = Get-AlarmIDs_XML -fileNamePath $Paper_Dialog_FullBasePath
               $excelDevice = Get_ErrorCodes -errorCodeListFilePath $outFilePath -ws "DEVICE COMPONENT MAP"
               foreach ($errCode in $ErrCodes | Where-Object{$excelDevice.Common_Alarm_Number -eq $errCode.Value }) 
               {
                  #$dataList = [System.Collections.Generic.List[psobject]]::new() 
                  #$resultHelp = [System.Collections.Generic.List[psobject]]::new() 
                  Write-Host "another:"
                  $err = $errCode.Value #get each error code to lookup in mdb file
                  $key = $errCode.Key
                  Write-Host $err
                  ...
                }

但它肯定会在不应该进入 foreach 循环的时候进入。

我的意图是使用 foreach,如果它在 $ErrCodes 中有一个值,那么它应该继续后面的代码。

如果您需要查看执行文件读取的函数,请告诉我,但数据结构如下所示:

$excelDevice:
[Object[57]]
[0]:@{Common_Alarm_Number=12-2000}
[1]:@{Common_Alarm_Number=12-5707}
[2]:@{Common_Alarm_Number=12-9}
[3]:@{Common_Alarm_Number=12-5703}
...

$ErrCodes:
[Object[7]]
[0]:@{Key=A;Value=12-5702}
[1]:@{Key=B;Value=12-5704}
[2]:@{Key=C;Value=12-5706}
[3]:@{Key=D;Value=12-5707}
...

所以我们只关心那些也在 $excelDevice 中的 $ErrCodes。

当我单步执行代码时,出于某种原因它进入了 12-5702 的 foreach 代码,而实际上它不应该存在(在屏幕上打印 12-5702)。我知道我不想使用 12-5702,因为它不在 $excelDevice 列表中。

如何让 Where-Object 过滤掉不在 $excelDevice 列表中的 $ErrCodes?我不想处理没有此设备数据的错误代码。

现在您正在测试 $excelDevice.Common_Alarm_Number 中的任何值(可能计算为数组)是否与 [=19= 的值完全相同]$errCodes.Value 中的所有值 - 这没有多大意义。

您似乎需要测试 each 错误代码以确定它是否在 $excelDevice.Common_Alarm_Number 列表中 contained反而。使用 $_ 来引用通过管道接收的单个输入项:

foreach ($errCode in $ErrCodes | Where-Object{ $excelDevice.Common_Alarm_Number -contains $_.Value }) { ... }