Where-Object 没有找到匹配但它应该

Where-Object not finding match but it should

我有像这样导入的代码和 excel 电子表格,我已经将其用于其他 excel 文件:

$importedExcel = Import-Excel -Path $errorCodeListFilePath -StartRow $startRow
return $importedExcel

返回的地图是这样存储的:

[Object[178]]
...
[2]:
Contents:"some string"
ErrorCode Upper: 12
ErrorCode Lower: "3A"
Error Item: "some more info"
Recovery: "important recovery info"
Recovery Method Info: "A12"
...

有时 ErrorCode Upper 是字符串,有时是数字,Lower 也一样。

$deviceErrDescMap = Process_ErrorDescMap -errorCodeListFilePath $errorCodeListFile

并且数据看起来符合预期,如上所示(excel 在上面的代码片段中返回)。

对于这个 excel 文件,我认为它很混乱,因为有些数据是 int 而有些是字符串,所以我认为我的 where-object 没有匹配。对于这个,我不得不将一个十六进制数分成前两位和后两位,因为电子表格将它们分成两列。

                  $sdkNum = "0x123A"
                  $sdkNumArr = @($sdkNum -split 'x') 
                  $sdkNumArr1 =  $sdkNumArr[1] -split ''
                  $sdkNumUpper = "$($sdkNumArr1[1])$($sdkNumArr1[2])" #12 ..naming is counter-intuitive
                  $sdkNumLower = "$($sdkNumArr1[3])$($sdkNumArr1[4])" #3A
                  $deviceErrDescRow = $deviceErrDescMap | Where-Object {([string]'ErrorCode Upper' -eq $sdkNumUpper)} #returns no results

当我将鼠标悬停在 $sdkNumUpper" 上时,我看到了 "12",所以它看起来像一个字符串。我不能像我显示的那样将 spreadsheet/map 内容转换为字符串吗?我遇到了麻烦通过 Internet 搜索找到此信息。但是我的 Where-Object 一定有问题,因为即使我看到该行在那里,它也为 $deviceErrDescRow 返回 null。

问题是您的 Where-Object 调用的语法:

... | Where-Object {([string]'ErrorCode Upper' -eq $sdkNumUpper)}

您正在比较 字符串文字 'ErrorCode Upper'$sdkNumUpper,而不是 .ErrorCode Upper [的 值属性.

如果您使用 Where-Object with a script block ({ ... }), you need to refer to the input object at hand via the automatic $_ variable

... | Where-Object { $sdkNumUpper -eq $_.'ErrorCode Upper' }

请注意,通过将 string-valued $sdkNumUpper 放在 LHS 上,RHS 上的 属性 值将隐式转换为字符串也可以,如果需要的话。


相比之下,当您使用语法更简单的 simplified syntax 时,属性 访问始终是 LHS,并且只有 属性 name必须指定,即隐式应用于手头的输入对象对象(换句话说:隐含应用于$_)。

# Note: 'ErrorCode Upper' binds to parameter -Property, $sdkNumUpper to -Value
# Equivalent to:
#   ... | Where-Object { $_.'ErrorCode Upper' -eq $sdkNumUpper }
... | Where-Object 'ErrorCode Upper' -eq $sdkNumUpper