使用 powershell 将集合保存到 csv 时出现问题

Issue while saving collection into csv using powershell

我有以下 powershell 代码,使用这些代码将结果保存到 csv 文件中,但我无法将它们保存到 csv 文件中。

[Reflection.Assembly]::LoadWithPartialName("Microsoft.AnalysisServices")

$SSASServerName = "SSAS_ServerName"
$SSASDB = "TESTDB"

$SSASServer = New-Object Microsoft.AnalysisServices.Server
$SSASServer.Connect($SSASServerName)
$SSASDatabase = $SSASServer.Databases.Item($SSASDB)
$SSASDatabase.Roles | Select-Object Name, Members | Export-Csv C:\dev\psout\test.Csv
pause

此脚本提取角色的名称以及与该角色关联的成员。一个角色可以有多个成员。

我试过上面的脚本,它导出角色,但在成员字段中,我看到所有角色的字符串 "Microsoft.AnalysisServices.RoleMemberCollection"。

如果我不导出到 csv,我可以在 ps window 或文本文件中查看成员。

我错过了什么?

您只能将可以表示为字符串的值导出到 csv 文件。 Members 是一个集合对象,可能包含多个 RoleMember 对象,因此您需要使用计算的 属性 来访问每个 Name-属性 中的 RoleMember。如何解决这个问题取决于所需的输出。

您可以将对象 Name-属性 连接到单个字符串

$SSASDatabase.Roles |
Select-Object Name, @{n="Members";e={ ($_.Members | % { $_.Name }) -join '; '}} |
Export-Csv C:\dev\psout\test.Csv -NoTypeInformation


Role1,"User1; User2"
Role2,"User3; User4"

或者您可以在 csv 文件 "per row per member" 中创建一行,我通常更喜欢这样,因为在 Excel.

中更容易过滤
$SSASDatabase.Roles | ForEach-Object {
    #Store role-reference so we can access it later inside the member-foreach
    $r = $_
    $r.Members | ForEach-Object {
        #Store member-reference so it's available inside Selec-Object
        $m = $_
        $r | Select-Object Name, @{n="Member";e={ $m.Name }}
    }
} | Export-Csv C:\dev\psout\test.Csv -NoTypeInformation


Role1,User1
Role1,User2
Role2,User3
...