powershell - foreach($map.keys 中的 $key)的行为不符合预期

标签 powershell foreach ordereddictionary pscustomobject

我正在尝试迭代 HashMap 的每个键,对于每个键,在 3 个不同的映射中查找它的值,并将其分配给 psCustomObject。由于某种原因,在只执行一次 foreach 后,resultsCase 看起来像这样,并且长度与我在 foreach 语句中获取键的映射相同。每次迭代 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 查找问题。

我不确定为什么它不在另一个映射中进行查找,而是实际将值放入 $resultCase 中。它只适用于最后一个,巧合的是,我用于 foreach 的 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")]) 

作为引用, map 如下所示:

HopResultMap:

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

HopResultMap2:

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

HopResultMap3(第三个有一点额外的内容,但额外的内容有不同的键...就像 sc...):

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

我无法真正更改 psCustomObject 数据结构,因为我有另一个具有相同数据结构的模型。这是使用 powershell 5.1 和 VSCode 进行的。

更新:

这 3 个 map 都是这样构建(类似)的:

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
}

最佳答案

由于您正在处理哈希表数组,而不是哈希表,因此通过[$key]引用 将为 null,这应该可以解决问题:

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

$dict2 = @(
    @{seFatal = "Fatal 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      Fatal error     Hop_Fatal_Error
1      Interface not.. Hop_Interface

mklement0指出,引用 $dict1 array 的每个元素的 Keys 属性 ($dict1.Keys) (这同样适用于 $dict2.$key$dict3.$key),这要归功于 member enumeration .

关于powershell - foreach($map.keys 中的 $key)的行为不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70992924/

相关文章:

xml - XSLT 包含错误

c# - 通过 Foreach 什么时候可以修改?

c# - 如何通过索引从 C# 中的 OrderedDictionary 获取键?

PowerShell 的 Clear-History 不会清除历史记录

powershell - 连接两个数组?

powershell - 将多个域添加到 azure 网站

python - 如何将 OrderedDict 转换为 Dict

powershell - PowerShell:开始作业,接收作业:无返回值

java - orderedlinkedlist JAVA统计.txt文件中的单词无重复单词加计数器>

Python OrderedDict 按日期排序