在PowerShell的ForEach-Object循环中获取当前哈希键值

16

我有一个哈希表:

$myHash = @{ 
   "key1" = @{
       "Entry 1" = "one"
       "Entry 2" = "two"
   }
   "key 2" = @{
       "Entry 1" = "three"
       "Entry 2" = "four"
   }
}

我正在进行一个循环,以获取这些对象:

$myHash.keys | ForEach-Object {
    Write-Host $_["Entry 1"]
}

代码运行良好,但我该使用什么来确定我处于$myHash键中的哪一个?$_.Name没有返回任何内容。我被难住了。有帮助吗?


好的,所以我最初在循环中忘记了 $myHash.keys 的 ".keys" 部分,这个错误在我的测试窗口和实际脚本中都存在。结果证明,指定 .keys 值确实可以使它工作。但是 Graimer 的代码也可以工作,即使有我的原始错误,所以他得到了勾选标记。 - Matt Simmons
3个回答

38

当我遍历哈希表时,我喜欢使用 GetEnumerator()。它会给你一个包含对象的属性 value 和相应键名/名称的属性 key。可以尝试一下:

$myHash.GetEnumerator() | % { 
    Write-Host "Current hashtable is: $($_.key)"
    Write-Host "Value of Entry 1 is: $($_.value["Entry 1"])" 
}

1
另一种常见的方式是: $hash.Keys | %{ "键是:$($),值是$($hash[$])" } - Jake H
它具有相同的功能,但需要多次读取哈希表,并更容易出现拼写错误。 - Frode F.

6

您也可以不使用变量来完成此操作。

@{
  'foo' = 222
  'bar' = 333
  'baz' = 444
  'qux' = 555
} | % getEnumerator | % {
  $_.key
  $_.value
}

4

这里是我用来读取ini文件的类似函数(值也是像你的那样的字典)。

被我转换成哈希表的ini文件看起来像这样

[Section1]

key1=value1
key2=value2

[Section2]

key1=value1
key2=value2
key3=value3

从ini文件中,哈希表看起来像这样(我传递了将转换函数转换为哈希表的功能):
$Inihash = @{ 
           "Section1" = @{
               "key1" = "value1"
               "key2" = " value2"
           }
           "Section2" = @{
               "key1" = "value1"
               "key2" = "value2"
         "key3" = "value3"
           }
        }

因此,从哈希表中,此行将搜索给定部分的所有键/值:

$Inihash.GetEnumerator() |?{$_.Key -eq "Section1"} |% {$_.Value.GetEnumerator() | %{write-host $_.Key "=" $_.Value}} 

? = 搜索特定节名称的 where-object 相等。 % = 你需要进行两次枚举!一次用于获取所有部分,另一次用于获取部分中的所有键。


很好地使用了管道并展示了嵌套。谢谢!这是 PowerShell 强大功能的绝佳示例。 - Joshua K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接