我正在尝试迭代 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/