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
我有像这样导入的代码和 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