powershell 如何在不显式声明属性名称的情况下访问嵌套哈希表中的属性?

rjee0c15  于 2022-12-04  发布在  Shell
关注(0)|答案(1)|浏览(112)

假设我有一个2级嵌套哈希表,如下所示:

$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

我做错了什么?
什么是正确的方法来访问嵌套的哈希表属性,而不需要明确地提到它们的名字?2我想知道它的语法,这样如果我有一个3或4层嵌套的哈希表,我就可以访问它们而不需要指定它们的确切名字。
即使我们忽略foreach循环,如何仅列出所有“DisplayName”属性?如果“DisplayName”属性位于4层嵌套哈希表中,并且我们希望在PowerShell控制台中列出它们,而不指定它前面的项的确切名称,该怎么办?

sxissh06

sxissh061#

由于Santiago Squarzonzett42的注解,下面是访问深度嵌套哈希表属性的语法。

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

我发现它工作得很好。
另外,在reading 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循环中,我们必须使用在括号中创建的变量。我的错误是我再次使用了集合本身。

相关问题