尝试输出自定义 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 输出 ,从不用于输出必须稍后以编程方式处理的 data。 Format-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] 中都有自己的行=].
我正在尝试通过获取用户的 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 输出 ,从不用于输出必须稍后以编程方式处理的 data。Format-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] 中都有自己的行=].