假设我有一个两层嵌套的哈希表:
$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循环中,必须使用在括号中创建的变量。我的错误是我又使用了集合本身。