添加到对象/阵列对象阵列powershell



这应该很简单,但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]]

最新更新