簡體   English   中英

foreach($map.keys 中的 $key)未按預期運行

[英]foreach ($key in $map.keys) not behaving as expected

我正在嘗試遍歷 hash map 的每個鍵,對於每個鍵,在 3 個不同的映射中查找它的值,分配給 psCustomObject。 由於某種原因,只經過一次foreach后,resultCase看起來像這樣,並且長度與我在foreach語句中取出Keys的map相同。 每次遍歷 foreach 時,它都會再次填充 69 行,覆蓋它們:

Object[69]
[0]: @{sdkErr=HopResultMap3[seFatal];sdkDesc=HopResultMap2[seFatal];sdkOutErr=HOP_FATAL_ERROR}
[1]:@{sdkErr=HopResultMap3[seInterface];sdkDesc=HopResultMap2[seInterface];sdkOutErr=HOP_INTERFACE}
...
[68]: @{...}

如您所見,它僅解決上述最后一項的 map 查找。

我不確定為什么它沒有在另一個 map 中進行查找,實際上將值放在 $resultCase 中。 它只適用於最后一個,巧合的是,我用於 foreach 的 map。 我設計了這個,所以我可以使用第一個 map 中的密鑰並使用它來查找其他兩個映射中的值。 我在這里需要一個組合的 map,這樣我就可以將代碼重用於具有不同文件結構的東西。

$resultCase = foreach ($key in $HopResultMap.Keys){ 
            [PSCustomObject][ordered]@{
              sdkErr      = $($HopResultMap3[$key]) 
              sdkDesc     = $($HopResultMap2[$key]) 
              sdkOutErr   = $($HopResultMap["$($key)"])
            }
         

 }

我也用這種方法對 Map2/3 進行了嘗試,但並沒有改變結果:

$($HopResultMap2[$($key)]) 
and also 
$($HopResultMap2["$($key")]) 

作為參考,地圖如下所示:

跳結果圖:

OrderedDictionary[69]
[0]:@{seFatal,Hop_Fatal_Error}
[1]:@{seInterface,Hop_Interface}
...

跳結果圖2:

OrderedDictionary[69]
[0]:@{seFatal,"Falal error"}
[1]:@{seInterface,"Interface not.."}
...

HopResultMap3 (在第三個中有一點額外的,但額外的有不同的鍵......就像 sc......):

OrderedDictionary[120]
...
[16]:@{seFatal,"0"}
[17]:@{seInterface,"1"}
...

我無法真正更改 psCustomObject 數據結構,因為我還有另一個 model 具有相同的數據結構。 這是 powershell 5.1 和 VSCode。

更新:

3張地圖都是這樣構造的(類似於):

function Get-Contents60{
    [cmdletbinding()]
    Param ([string]$fileContent)


            #m_HopErrorMap.insert(make_pair(
            #MAKEWORD(scError,sePaperJam),
            #HOP_JAM ));

    # create an ordered hashtable to store the results
    $errorMap = [ordered]@{}
    # process the lines one-by-one
    switch -Regex ($fileContent -split '\r?\n') {
        'MAKEWORD\([^,]+,([^)]+)\),' { # seJam, seFatal etc.
            $key = $matches[1]
        }
        '(HOP_[^)]+)' {
            $errorMap[$key] = $matches[1].Trim()
        }
    }
    return $errorMap
}

Since you are dealing with arrays of hash tables and not with hash tables , referencing by [$key] will be null, this should likely solve the problem:

$dict1 = @(
    @{seFatal = 'Hop_Fatal_Error'}
    @{seInterface = 'Hop_Interface'}
)

$dict2 = @(
    @{seFatal = "Falal error"}
    @{seInterface = "Interface not.."}
)

$dict3 = @(
    @{seFatal = "0"}
    @{seInterface = "1"}
)

foreach($key in $dict1.Keys)
{
    [pscustomobject]@{
        sdkErr = $dict3.$key
        sdkDesc = $dict2.$key
        sdkOutErr = $dict1.$key
    }
}

結果將是:

sdkErr sdkDesc         sdkOutErr
------ -------         ---------
0      Falal error     Hop_Fatal_Error
1      Interface not.. Hop_Interface

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM