这应该很简单,但powershell没有给我有效的输出。我对处理这个问题的其他方法持开放态度。在高级中,如果建议另一个选项,我需要一些可以从函数的参数中使用的东西。
我想做的是:
$PrinterPermissions =
@(
@('Administrators', 'ManagePrinters','Allow'),
@('Power Users', 'ManagePrinters','Allow'),
@('Print Operators', 'ManagePrinters','Allow'),
@('OHD – Network Support Team', 'ManagePrinters','Allow'),
@("OHD – PC Support Team", 'ManageDocuments','Allow'),
@("OHD - Service Desk Users", 'ManageDocuments','Allow')
)
$PrinterPermissions += @("gprt_PrinterA","ManageDocuments","Allow")
访问我期望称之为的对象
$PrinterPermissions[0][0] *= Administrators*
$PrinterPermissions[0][1] *= ManagePrinters*
$PrinterPermissions[0][2] *= Allow*
然而,当我将新添加的对象调用到数组时,我会得到前6个对象正常工作,但新添加的目标函数如下:
$PrinterPermissions[6] = gprt_PrinterA
$PrinterPermissions[6][0] = g
$PrinterPermissions[6][1] = p
$PrinterPermissions[6][2] = r
$PrinterPermissions[7] = ManageDocuments
$PrinterPermissions[8] = Allow
我想要的是让新添加的项在数组中作为前6项发挥作用。所以我可以动态地添加到数组中。我做错了什么。
我同意mklement0的观点,您最好使用Generic List来完成这项工作,因为它的设计目的是添加/删除项,而不像"普通"数组,每次添加都必须在内存中整体重建。
此外,当你可以使用对象(正如你的问题的标题所示(更干净(IMO(的时候,为什么要麻烦把它作为数组数组来做呢
# create a new List of objects
$PrinterPermissions = [System.Collections.Generic.List[object]]::new()
# set up the initial 6 items in the list
$PrinterPermissions.AddRange(([PsCustomObject]@{ Group = 'Administrators'; Permission = 'ManagePrinters'; AccessType = 'Allow' },
[PsCustomObject]@{ Group = 'Power Users'; Permission = 'ManagePrinters'; AccessType = 'Allow' },
[PsCustomObject]@{ Group = 'Print Operators'; Permission = 'ManagePrinters'; AccessType = 'Allow' },
[PsCustomObject]@{ Group = 'OHD – Network Support Team'; Permission = 'ManagePrinters'; AccessType = 'Allow' },
[PsCustomObject]@{ Group = 'OHD – PC Support Team'; Permission = 'ManagePrinters'; AccessType = 'Allow' },
[PsCustomObject]@{ Group = 'OHD - Service Desk Users'; Permission = 'ManagePrinters'; AccessType = 'Allow' }))
# add a new item to the list
$PrinterPermissions.Add([PsCustomObject]@{ Group = 'gprt_PrinterA'; Permission = 'ManagePrinters'; AccessType = 'Allow' })
# show on screen
$PrinterPermissions
结果
Group Permission AccessType
----- ---------- ----------
Administrators ManagePrinters Allow
Power Users ManagePrinters Allow
Print Operators ManagePrinters Allow
OHD – Network Support Team ManagePrinters Allow
OHD – PC Support Team ManagePrinters Allow
OHD - Service Desk Users ManagePrinters Allow
gprt_PrinterA ManagePrinters Allow
检索第7项:
$PrinterPermissions[6]
结果
Group Permission AccessType
----- ---------- ----------
gprt_PrinterA ManagePrinters Allow
从列表中的项目获取单个属性
$PrinterPermissions[5].Group # --> OHD - Service Desk Users
$PrinterPermissions[5].Permission # --> Allow
将列表保存为CSV文件以备日后使用(可能在Excel中(
$PrinterPermissions | Export-Csv -Path 'X:PrinterPermissions.csv' -UseCulture -NoTypeInformation
等等。
注意:
-
这个答案解决了所问的问题。
-
有关使用自定义对象而不是嵌套数组的最终更好的解决方案,请参阅Theo的有用答案。
为了将RHS数组添加为单个元素,必须使用数组构造运算符,
的一元形式将其包装在瞬态单个元素包装数组中。
$PrinterPermissions += , @("gprt_PrinterA","ManageDocuments","Allow")
请注意,从技术上讲,添加到数组每次都会创建一个新的数组,这是低效的。对于小数组,这可能无关紧要,但对于迭代添加许多元素,您应该考虑切换到有效扩展的列表类型,例如[System.Collections.Generic.List[string]]