【问题标题】:Getting the current hash key in a ForEach-Object loop in powershell在 Powershell 的 ForEach-Object 循环中获取当前哈希键
【发布时间】:2013-01-30 14:28:25
【问题描述】:

我有一个哈希表:

$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 的代码也有效,即使是我最初的错误,所以他得到了复选标记。

标签: powershell hashtable


【解决方案1】:

这里有一个我用来读取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}} 

? = for search where-object equal my section name. % = you have to do 2 enumeration ! one for all the section and a second for get all the key in the section.

【讨论】:

    【解决方案2】:

    你也可以不使用变量来做到这一点

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

    【讨论】:

      【解决方案3】:

      我喜欢在循环哈希表时使用GetEnumerator()。它将为您提供带有对象的属性value,以及带有其键/名称的属性key。试试:

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

      【讨论】:

      • 谢谢!我很感激。效果很好!
      • 另一种常见的方式是:$hash.Keys | %{ "键是:$($_),值是$($hash[$_])" }
      • 作用相同,但需要多次读取哈希表,更容易出现拼写错误
      猜你喜欢
      • 2021-06-22
      • 2021-11-25
      • 2014-11-28
      • 2018-12-11
      • 2020-05-11
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多