foreach ($key in $map.keys) 未按预期运行
foreach ($key in $map.keys) not behaving as expected
我试图遍历哈希映射的每个键,对于每个键,在 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]: @{...}
如您所见,它只解决了上面最后一项的地图查找。
我不确定为什么它不在另一个地图中进行查找,而是将值实际放入 $resultCase 中。它只适用于最后一个,巧合的是,我正在为 foreach 使用的地图。我设计这个是为了可以使用第一个地图中的键并使用它来查找其他两个地图中的值。我在这里需要一个组合地图,这样我就可以为具有不同文件结构的东西重新使用代码。
$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")])
供参考,地图如下所示:
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张地图都是这样构造的(类似):
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]
引用将为空,这应该可以解决问题:
$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 points out, referencing the Keys property ($dict1.Keys
) of each element of the $dict1
array (the same applies to $dict2.$key
and $dict3.$key
) is possible thanks to member enumeration.
我试图遍历哈希映射的每个键,对于每个键,在 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]: @{...}
如您所见,它只解决了上面最后一项的地图查找。
我不确定为什么它不在另一个地图中进行查找,而是将值实际放入 $resultCase 中。它只适用于最后一个,巧合的是,我正在为 foreach 使用的地图。我设计这个是为了可以使用第一个地图中的键并使用它来查找其他两个地图中的值。我在这里需要一个组合地图,这样我就可以为具有不同文件结构的东西重新使用代码。
$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")])
供参考,地图如下所示:
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张地图都是这样构造的(类似):
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]
引用将为空,这应该可以解决问题:
$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 points out, referencing the Keys property ($dict1.Keys
) of each element of the $dict1
array (the same applies to $dict2.$key
and $dict3.$key
) is possible thanks to member enumeration.