【发布时间】: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