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 }) { ... }
我有以下代码:
$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 }) { ... }