【问题标题】:PowerShell - Add variables with multiple values to CSV columnPowerShell - 将具有多个值的变量添加到 CSV 列
【发布时间】:2022-01-24 15:45:11
【问题描述】:

我有一个奇怪的场景,我试图使用 PowerShell 填充 .CSV 文件,但它不是传统的 .CSV 文件。我想在一个单元格中有两个包含多个值的列。

所需的 CSV 输出:

Team Name           Team Users           Team Access
Team 1              User 1               App 1
                    User 2               App 2
                    User 3               App 3 
Team 2              User 4               App 1
                    User 5               App 2
                    User 6               App 3 

因此,基本上,对于上述情况,我只想要包含所有这些信息的两行。

当我尝试使用 Export-CSV 并为用户和应用程序定义变量时,我的 CSV 如下所示:

Team Name           Team Users           Team Access
Team 1              System.Object[]      System.Object[] 
Team 2              System.Object[]      System.Object[] 

所以我想知道如何将对象值作为文字值或使用 Add-Content / Add-Member 之类的东西来添加基于 CSV 标头的值?

这是我当前的代码:

$RBAC_Groups = Get-ADGroup -Filter {Name -like "RBAC*"} -SearchBase "DC=example,DC=com"


ForEach ($Group in $RBAC_Groups) {
    
    #Get AD Group Members
    $Users = Get-ADGroupMember -Identity $Group.Name

    #Get AD Group Member Of 
    $Membership = Get-ADPrincipalGroupMembership $Group.Name

    $Final = New-Object psobject

    $Final | Add-Member -MemberType NoteProperty -Name "RBAC Group" -Value $Group.Name
    $Final | Add-Member -MemberType NoteProperty -Name "RBAC Users" -Value $Users.Name
    $Final | Add-Member -MemberType NoteProperty -Name "RBAC Access" -Value $Membership.Name

    $Final | Export-Csv -Path C:\Temp\RBAC_Weekly_Audit.csv -Append -NoTypeInformation
}

谢谢,

【问题讨论】:

  • 请在问题中添加您要尝试的内容。
  • 您确定要让它看起来像这样吗?正如您所提到的,它不是传统的,并且与 Excel 过滤器不兼容。
  • 嗨@iRon,我已将代码添加到问题中,如果这有帮助,请告诉我。
  • @SantiagoSquarzon,是的,这是一个奇怪的问题,但本质上我们想为 RBAC 组、组中的成员以及他们拥有的访问权限审核/创建报告。因此组名永远只有 1 个值,而用户/访问权限将是多个值。
  • 老实说,我认为使用(有点)标准化的 CSV 文件会更好。也就是说,生成一个包含六行的文件,其中每一行的第一个字段中明确包含团队名称。您将能够非常轻松地使用 excel、SQL Server 甚至 Poweshell 读取此 CSV。您可以在报告生成时形成多值组。这只是更简单的数据管理。

标签: powershell csv


【解决方案1】:

您只需要将数组属性Team UsersTeam Access 转换为多行字符串(数组也是您在导出对象时看到System.Object[] 的原因)。 p>

如何将数组转换成多行字符串

  • $array -join [environment]::NewLine
  • $array -join "`r`n"
  • ($array | Out-String).TrimEnd()

还有其他...


$RBAC_Groups = Get-ADGroup -Filter "Name -like 'RBAC*'" -SearchBase "DC=example,DC=com"
$export = foreach($group in $RBAC_Groups)
{
    $members = @(Get-ADGroupMember -Identity $Group.Name).Where({
        $_.ObjectClass -eq 'user'
    })
    $principals = Get-ADPrincipalGroupMembership $Group.Name

    [pscustomobject]@{
        'RBAC Group'  = $group.Name
        'RBAC Users'  = $members -join [System.Environment]::NewLine
        'RBAC Access' = $principals -join [System.Environment]::NewLine
    }
}
$export | Export-Csv -Path C:\Temp\RBAC_Weekly_Audit.csv -NoTypeInformation

我如何知道我的属性是否是一个数组

在控制台中显示对象时,数组属性的值将显示在括号{...} 之间。 .GetType() 方法和Get-Member 也可以用来识别它们:

PS /> $obj[0]

Team Name Team Users               Team Access
--------- ----------               -----------
Team 1    {User 1, User 2, User 3} {App 1, App 2, App 3}

PS /> $obj[0].'Team Users'.GetType()

IsPublic IsSerial Name             BaseType
-------- -------- ----             --------
True     True     Object[]         System.Array

PS /> $obj[0] | Get-Member -MemberType Properties

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Team Access NoteProperty Object[] Team Access=System.Object[]
Team Name   NoteProperty string Team Name=Team 1
Team Users  NoteProperty Object[] Team Users=System.Object[]

【讨论】:

  • @script_newbie129 乐于助人,我建议您的领导,这不是导出数据的好方法,但他们可能不会听呵呵
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2014-09-04
相关资源
最近更新 更多