Loops 嵌套循环寻址独立(非嵌套)哈希表时出现问题
我遇到了一个问题,即如何具体处理两个可能的哈希表之一。让我澄清一下——这些哈希表不是嵌套的,但是有两个循环,每个哈希表一个。这些循环是嵌套的 在内部循环(即通过WWPNTable中的键进行迭代的循环)中,我希望访问由外部循环进行迭代的哈希表的当前键。考虑到当前的方法(我对此相当陌生),我总是只使用Loops 嵌套循环寻址独立(非嵌套)哈希表时出现问题,loops,powershell,hashtable,Loops,Powershell,Hashtable,我遇到了一个问题,即如何具体处理两个可能的哈希表之一。让我澄清一下——这些哈希表不是嵌套的,但是有两个循环,每个哈希表一个。这些循环是嵌套的 在内部循环(即通过WWPNTable中的键进行迭代的循环)中,我希望访问由外部循环进行迭代的哈希表的当前键。考虑到当前的方法(我对此相当陌生),我总是只使用$\uu,但是这种方法非常依赖于范围(在内部循环中使用,$\u总是引用WWPNTable,在这种情况下,我需要它引用vAntable) 我意识到我也在使用外部循环的.Keys和内部循环的.GetEnum
$\uu
,但是这种方法非常依赖于范围(在内部循环中使用,$\u
总是引用WWPNTable,在这种情况下,我需要它引用vAntable)
我意识到我也在使用外部循环的.Keys和内部循环的.GetEnumerator——这不是基于任何逻辑,我也很喜欢那里的指导。我的主要目标是能够使用内循环中包含的代码来处理外循环正在处理的哈希表中的当前键/值对。首先,使用mjolinor的答案,这是一种更好的方法,并且不太可能引起混淆和范围问题 话虽如此,如果您仍然希望在管道中运行嵌套循环,我所知道的实现引用外部循环当前迭代的嵌套循环的最简单方法是在启动内部循环之前将$分配给命名变量。例如:
<script stuff>|%{
$Current = $_ # <= THIS LINE RIGHT HERE
<more script stuff>|%{
If($_ -match $Current){do stuff}
}
}
|%{
$Current=$#首先,使用mjolinor的答案,这是一种更好的方法,并且不太可能引起混淆和范围问题
话虽如此,如果您仍然希望在管道中运行嵌套循环,我所知道的实现引用外部循环当前迭代的嵌套循环的最简单方法是在启动内部循环之前将$分配给命名变量。例如:
<script stuff>|%{
$Current = $_ # <= THIS LINE RIGHT HERE
<more script stuff>|%{
If($_ -match $Current){do stuff}
}
}
|%{
$Current=$#首先,使用mjolinor的答案,这是一种更好的方法,并且不太可能引起混淆和范围问题
话虽如此,如果您仍然希望在管道中运行嵌套循环,我所知道的实现引用外部循环当前迭代的嵌套循环的最简单方法是在启动内部循环之前将$分配给命名变量。例如:
<script stuff>|%{
$Current = $_ # <= THIS LINE RIGHT HERE
<more script stuff>|%{
If($_ -match $Current){do stuff}
}
}
|%{
$Current=$#首先,使用mjolinor的答案,这是一种更好的方法,并且不太可能引起混淆和范围问题
话虽如此,如果您仍然希望在管道中运行嵌套循环,我所知道的实现引用外部循环当前迭代的嵌套循环的最简单方法是在启动内部循环之前将$分配给命名变量。例如:
<script stuff>|%{
$Current = $_ # <= THIS LINE RIGHT HERE
<more script stuff>|%{
If($_ -match $Current){do stuff}
}
}
|%{
$Current=$\u#切换到使用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_键,当前的WWPNTable键将是$WWPN_键
就使用.keys或.getenumerator()并选择键名而言,只要您确信永远不会有名为“keys”的项,就可以安全地使用.keys。如果遇到该项,您将返回该表项的值,而不是键集合。如果有可能,您可以将其作为键名,请坚持使用.getenumerator()。切换到使用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_键,当前的WWPNTable键将是$WWPN_键
就使用.keys或.getenumerator()并选择键名而言,只要您确信永远不会有名为“keys”的项,就可以安全地使用.keys。如果遇到该项,您将返回该表项的值,而不是键集合。如果有可能,您可以将其作为键名,请坚持使用.getenumerator()。切换到使用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_键,当前的WWPNTable键将是$WWPN_键
就使用.keys或.getenumerator()并选择键名而言,只要您确信永远不会有名为“keys”的项,就可以安全地使用.keys。如果遇到该项,您将返回该表项的值,而不是键集合。如果有可能,您可以将其作为键名,请坚持使用.getenumerator()。切换到使用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_键,当前的WWPNTable键将是$WWPN_键
就使用.keys或.getenumerator()并选择键名而言,只要您确信永远不会有名为“keys”的项,就可以安全地使用.keys。如果遇到该项,您将返回该表项的值,而不是键集合。如果有可能,您可以将其作为键名,请坚持使用.getenumerator()。听起来“保持简单”的建议。谢谢!不能用一对foreach对象循环创建嵌套循环。至少其中一个必须是foreach循环或for循环。除非处理需要从管道读取的数据(如大文件)坚持使用foreach循环,使用好的描述性变量名,这将使代码更容易理解建议。谢谢!不能用一对foreach对象循环创建嵌套循环。至少其中一个必须是foreach循环或for循环。除非处理需要从管道读取的数据(如大文件)坚持使用foreach循环,使用好的描述性变量名,这将使代码更容易理解建议。谢谢!不能用一对foreach对象循环创建嵌套循环。至少其中一个必须是foreach循环或for循环。除非处理需要从管道读取的数据(如大文件)坚持使用foreach循环,使用好的描述性变量名,这将使代码更容易理解