如何在一个嵌套的哈希表中访问属性,而不显式地说明属性名称?



假设我有一个两层嵌套的哈希表:

$programs = @{

program1 = @{
DisplayName = "DisplayName1"
Program = "C:program1.exe"
}
program2 = @{
DisplayName = "DisplayName2"
Program = "C:program2.exe"
}
}

现在,不需要像这样明确地提到每个属性名:

$programs.program1['program']

我希望像这样遍历哈希表:

foreach ($Name in $programs) {

$r = Get-NetFirewallRule -DisplayName $programs.Keys['DisplayName'] 2> $null; 
if (-NOT $r) { 

New-NetFirewallRule -DisplayName $programs.Keys['DisplayName']  -Program $program.Keys['Program']

}
}

,但我一直得到错误像:

Cannot validate argument on parameter 'DisplayName'. The argument is null. Provide a valid value for the argument, and then try running the command again.
InvalidOperation: untitled:Untitled-2:29:13

我做错了什么?

像这样访问嵌套哈希表属性而不显式提及其名称的正确方法是什么?我想知道它的语法,这样如果我有一个3或4层嵌套的哈希表,我可以访问它们而不指定它们的确切名称。

即使忽略foreach循环,如何只列出所有的"DisplayName"属性呢?如果DisplayName"属性在一个4级嵌套的哈希表中,我们想在PowerShell控制台列出它们,而不指定在它之前的项目的确切名称?

感谢Santiago Squarzon和zett42的评论,这里是访问深度嵌套哈希表属性的语法。

$programs.Values.Values.Values and so on.

我发现它工作得很好。

同样,在阅读了foreach和评论中提到的,我发现我上面的代码是不正确的,正确的方法是:

foreach ($Name in $programs.values.GetEnumerator()) {

$r = Get-NetFirewallRule -DisplayName $Name.DisplayName 2> $null; 
if (-NOT $r) { 

New-NetFirewallRule -DisplayName $Name.DisplayName -Program $Name.Program

}
}

在foreach循环中,必须使用在括号中创建的变量。我的错误是我又使用了集合本身。

最新更新