我有一个问题,想弄清楚如何专门解决两个可能的哈希表之一。让我说清楚 - 这些哈希表不是嵌套的,但是有两个循环,每个哈希表一个。这些循环是嵌套的。
在内部循环中 - 迭代WWPNTable中的键的内部循环,我想访问外部循环迭代的散列表的当前键。鉴于当前的方法(我对此有了新的意义),我总是只使用$_
,但是这种方法非常依赖于范围(在内部循环中使用$_
总是指WWPNTable,在这种情况下我需要它来引用VSANTable。)
$VSANTable.Add("A", $FabAVSAN)
$VSANTable.Add("B", $FabBVSAN)
#Outer loop
$VSANTable.Keys | % {
$WWPNTable = @{}
#Some code to populate WWPNTable....
#Inner loop - note also the .GetEnumerator vs .Keys
$WWPNTable.GetEnumerator() | Sort-Object Name | % {
Add-Content $ConfigFile ("zone name " + $($_.key) + "_TO_NTAP vsan " + $thisVSAN)
Add-Content $ConfigFile (" member pwwn " + $($_.value))
if ($_ -eq "A") { ##This is not working right now because $_ at this scope refers to WWPNTable, not VSANTable.
foreach ($target in $FabATargets) {
Add-Content $ConfigFile (" member pwwn " + $target)
}
} else {
foreach ($target in $FabBTargets) {
Add-Content $ConfigFile (" member pwwn " + $target)
}
}
}
}
我意识到我也使用.Keys作为外部循环和.GetEnumerator在内部 - 这不是基于任何逻辑,我也喜欢那里的指导。我的主要目标是能够使用内部循环中包含的代码来解决外部循环寻址的散列表中的当前键/值对。
答案 0 :(得分:2)
切换到使用foreach循环:
#Outer loop
foreach ($VSAN_Key in $VSANTable.Keys)
{
#Inner loop
foreach ($WWPN_Key in ($WWPNTable.keys | Sort-Object) )
{
#Inner loop code
} #End inner loop
} #End Outer loop
然后在内部循环中,当前的VSANTable键为$ VSAN_Key,当前的WWPNTable键为$ WWPN_Key。
至于使用.keys或.getenumerator()并选择键名,只要您确定不会有名为“keys”的条目,就可以安全地使用.keys。如果遇到这种情况,您将获得该表条目的值而不是密钥集合。如果有可能你可以将其作为关键名称,那么坚持使用.getenumerator()。
答案 1 :(得分:1)
首先,使用mjolinor的答案,这是一种更好的方法,并且不太可能引起混淆和范围问题。
话虽如此,如果你仍然想在管道中运行嵌套循环,我所知道的最简单的方法是完成一个引用外部循环的当前迭代的嵌套循环,就是在之前为命名变量分配$ _启动内循环。例如:
<script stuff>|%{
$Current = $_ # <= THIS LINE RIGHT HERE
<more script stuff>|%{
If($_ -match $Current){do stuff}
}
}