【问题标题】:Adding to object/array of array objects powershell添加到对象/数组对象的数组powershell
【发布时间】:2022-01-03 06:10:15
【问题描述】:

这应该很简单,但 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 个项目起作用。所以我可以动态添加到数组中。我做错了什么。

【问题讨论】:

  • 集合的集合使用起来非常尴尬。相反,我会创建一个包含 PSCustomObjects 的 generic.list。

标签: arrays powershell


【解决方案1】:

我同意mklement0 你最好使用通用列表来完成这项工作,因为它旨在添加/删除与“普通”数组不同的项目,该数组必须在每个内存中作为一个整体进行重建补充。

此外,当您可以使用 objects (正如您的问题的标题所暗示的那样)更清洁(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

等等

【讨论】:

    【解决方案2】:

    注意:

    • 这个答案解决了问题

    • 有关使用自定义对象而不是嵌套数组的最终更好的解决方案,请参阅Theo's helpful answer

    要将 RHS 数组添加为单个元素,您必须使用 array-construction operator, , 的一元形式将其包装在瞬态单元素包装器数组中。

    $PrinterPermissions += , @("gprt_PrinterA","ManageDocuments","Allow")
    

    请注意,从技术上讲,添加到数组每次都会创建一个 new 数组,这是低效的。对于小型数组,这可能无关紧要,但对于迭代添加许多元素,您应该考虑切换到高效可扩展的列表类型,例如 [System.Collections.Generic.List[string]]

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 2022-01-13
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多