我有這樣的匯入和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",所以它看起來像一個字串。我不能像我顯示的那樣將電子表格/地圖內容轉換為字串嗎?我無法通過 Internet 搜索找到此資訊. 但是我的 Where-Object 一定有問題,因為即使我看到該行在那里,它也會為 $deviceErrDescRow 回傳 null。
uj5u.com熱心網友回復:
問題是您Where-Object呼叫的語法:
... | Where-Object {([string]'ErrorCode Upper' -eq $sdkNumUpper)}
您將字串文字 'ErrorCode Upper'與進行比較$sdkNumUpper,而不是屬性的值.ErrorCode Upper。
如果您使用Where-Object的是腳本塊( ),則需要通過自動變數{ ... }參考手頭的輸入物件$_
... | Where-Object { $sdkNumUpper -eq $_.'ErrorCode Upper' }
請注意,通過將字串值$sdkNumUpper放在LHS上,如果需要,RHS 上的屬性值也會隱式轉換為字串。
相比之下,當您使用語法上更簡單的簡化語法時,屬性訪問始終是 LHS,并且必須僅指定屬性名稱,該名稱隱式應用于手頭的輸入物件物件(換句話說:$_隱含應用到) .
# Note: 'ErrorCode Upper' binds to parameter -Property, $sdkNumUpper to -Value
# Equivalent to:
# ... | Where-Object { $_.'ErrorCode Upper' -eq $sdkNumUpper }
... | Where-Object 'ErrorCode Upper' -eq $sdkNumUpper
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/454887.html
標籤:电源外壳 where-object
上一篇:在PowerShell中從C#訪問固定大小的陣列元素
下一篇:查找計算機和執行策略
