尝试输出自定义 powershell 对象,我可以在其中对齐包含 Category:Description 的两个不同变量的每一行

Trying to output a custom powershell object where I can align each line of two different variables containing Category:Description

我正在尝试通过获取用户的 AD 组及其描述来进行网络访问控制审核,然后以本示例所示的方式输出它们:


[User]

@[1]Groups : @[1]GroupDescription @[2]...
@[3]...


以下是我目前的资料。

$UserGroups = @{

User = Read-Host -Prompt "What user do You want to look up Access for?"
Groups = (Get-ADUser $User -Properties MemberOf).MemberOf
GroupsDescriptions = (Get-ADUser $User -Properties MemberOf).MemberOf | % {(Get-ADGroup $_ -Properties *).description}
}

$Object = New-Object psobject -Property $UserGroups

$Object | format-table | Export-Csv c:\tmp\test.csv

虽然输出很奇怪。我不明白。下面是 Get-Content C:tmp\test.csv

的结果

#TYPE Microsoft.PowerShell.Commands.Internal.Format.FormatStartData "ClassId2e4f51ef21dd47e99d3c952918aff9cd","pageHeaderEntry","pageFooterEntry","autosizeInfo","shapeInfo","groupingEntry" "033ecb2bc07a4d43b5ef94ed5a35d280",,,,"Microsoft.PowerShell.Commands.Internal.Format.TableHeaderInfo", "9e210fe47d09416682b841769c78b8a3",,,,, "27c87ef9bbda4f709f6b4002fa4af63c",,,,, "4ec4f0187cb04f4cb6973460dfe252df",,,,, "cf522b78d86c486691226b40aa69e95c",,,,,

我曾尝试使用 Out-file 输出到 .txt 文件,但我总是在每个 属性 结尾处用 ... 截断。在将数据传输到导出行之前,我在格式化数据时使用了 -Autosize 和 -Expand。

任何建议或意见都将非常有帮助。

我稍后会看的东西 Go through each line in PowerShell object and extract variables 谢谢!

问题是您先通过管道传输到 Format-Table,然后再通过管道传输到 Export-Csv。仅使用 Format-Table 在屏幕上显示内容。解决方法是将其删除。

$Object | Export-Csv c:\tmp\test.csv
  • 如前所述,仅使用 Format-* cmdlet 来生成 for-display 输出 ,从不用于输出必须稍后以编程方式处理的 dataFormat-Table 输出的是代表 格式化指令 的对象,并且 它们的 属性最终出现在您的 CSV 文件中 - 请参阅 this answer了解更多信息。

  • 为了在 CSV 输出中包含 集合(数组),您必须将它们转换为 单个字符串,使用 self-chosen 分隔符。否则,Export-Csv 只是在 集合对象本身 上调用 .ToString(),这会产生集合的 类型名称 ,并且没有任何信息关于它的元素。

因此,使用类似于以下内容的内容,它使用 ', ' 作为分隔符字符串,在每个列中表示组名称和描述:

$UserGroups = [pscustomobject] @{
  User = ($user = Read-Host -Prompt "What user do You want to look up Access for?")
  Groups = ($groups = (Get-ADUser $User -Properties MemberOf).MemberOf) -join ', '
  GroupsDescriptions = (
      $groups | ForEach-Object { (Get-ADGroup $_ -Properties *).Description }
    ) -join ', '
}

$UserGroups | Export-Csv c:\tmp\test.csv

注:

  • [pscustomobject] @{ ... }用于直接构造自定义对象,这是自PowerShell v3以来可用的语法糖,比a更简单高效New-Object呼唤。

  • 为了在对象定义的后续属性中使用 Read-Host 调用的结果,您必须将其缓存在 aux 中。变量 $user(请注意,将赋值括在 (...) 中会传递其值。

  • 同样,Get-ADUser调用的结果缓存在aux中。变量 $groups,这样它就不必在 GroupsDescriptions 值中重复。

  • 但是,正如 zett42 指出的那样,将 $user = ...$groups = ... 赋值分开的语句并将它们放在 中可能更清晰在对象构造之前。

多亏了这个 post Here 和 mklement0。我能够弄清楚这个问题的格式部分。

现在我有了完全按预期导出它的剩余代码。

$user= Read-Host -Prompt "What user bonehead?"
$object =  Get-ADPrincipalGroupMembership $user

$Table = $object | ForEach-Object {
    [pscustomobject] @{
        Groups = $_.Name
        GroupDesc = (Get-ADGroup $_ -Properties *).Description
        GroupOwner = (Get-ADGroup $_ -Properties *).Info
        }
    }
    

$Table | Export-csv -NoTypeInformation c:\tmp\test.csv

-NoTypeInformation 有助于消除 .csv 文件上的 header 和通过 ForEach-Object cmdlet 的管道组信息有助于确保每个 object 在 [=19] 中都有自己的行=].