【问题标题】:How to access properties in a nested hashtable without explicitly stating the property names?如何在不明确说明属性名称的情况下访问嵌套哈希表中的属性?
【发布时间】:2022-11-15 20:15:15
【问题描述】:

假设我有一个像这样的 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

我究竟做错了什么?

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

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

【问题讨论】:

  • 您正在寻找 $programs.Values.DisplayName$program.Values.Program
  • 迭代哈希表与其他容器略有不同:foreach( $prog in $programs.GetEnumerator() ) { Get-NetFirewallRule -DisplayName $prog.Value.DisplayName }
  • 谢谢,即使我将程序和显示名称用双引号括起来作为字符串,我仍然收到此错误Cannot process argument transformation on parameter 'DisplayName'. Cannot convert value to type System.String.
  • 我会把它作为一个 csv 然后 import-csv 来做。

标签: powershell hashtable powershell-7.2


【解决方案1】:

感谢 Santiago Squarzonzett42 的 cmets,这里是访问深度嵌套哈希表属性的语法。

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

我发现它工作得很好。

此外,在reading foreach 之后,如 cmets 中所述,我发现我上面的代码不正确,正确的方法是:

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 循环中,我们必须使用我们在括号中创建的变量。我的错误是我再次使用集合本身。

【讨论】:

    猜你喜欢
    • 2021-07-04
    • 2013-05-10
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2020-08-29
    • 1970-01-01
    相关资源
    最近更新 更多