在PowerShell中将System.Object[]导出为字符串

8
我创建了一个脚本,基本上遍历站点及其子网站中的所有列表,并列出每个文档或项的权限。
脚本可以正常运行,但是在写入CSV文件时,权限(成员+角色)字符串被写为System.Object [],而不是CSV输出中的正确字符串(例如Member:user123 Role:Full Control)。
示例输出:
"Common Hover Panel Actions", "https://#######.####.###.##", "https://######.######.#####.####", "System.Object[]", "                           Ministry for Finance", "Master Page Gallery", "12/22/2015 8:34:39 AM", "_catalogs/masterpage/Display Templates/Search/Item_CommonHoverPanel_Actions.js", "12/22/2015 8:34:39 AM", "6.2763671875"

以下是脚本内容:
Add-PSSnapin Microsoft.SharePoint.PowerShell

function Get-DocInventory([string]$siteUrl) {
    $site = New-Object Microsoft.SharePoint.SPSite $siteUrl

    $i = 0;
    foreach ($web in $site.AllWebs) {

        $count = $site.AllWebs.Count
        foreach ($list in $web.Lists) {

            if ($list.BaseType -ne “DocumentLibrary”)
            {
               continue
            }

            foreach ($item in $list.Items) {
                $data = @{
                    "Web Application" = $web.ToString()
                    "Site" = $site.Url
                    "Web" = $web.Url
                    "list" = $list.Title
                    "Item URL" = $item.Url
                    "Item Title" = $item["Title"]
                    "Item Created" = $item["Created"]
                    "Item Modified" = $item["Modified"]
                    "File Size" = $item.File.Length/1KB
                    "Permissions" = foreach($roleAssignment in $item.RoleAssignments)
                    {
                        $Permission = ""

                        foreach($roleDefinition in $roleAssignment.RoleDefinitionBindings)
                        {
                            $Permission = $(foreach($roleAssignment in $item.RoleAssignments){$roleAssignment}
                            {
                                "Member: " +  $roleAssignment.Member.LoginName + " Role: " + $roleDefinition.Name + " "
                            } -join ',')

                            $Permission
                            Write-Progress -activity "Working" -status "Checked Sub-Site $i of $count" -percentComplete (($i / $count)/100)
                        }
                    }
                }
                New-Object PSObject -Property $data
            }
        }
        $web.Dispose();
    }
    $i++
    $site.Dispose()
}
<# Get-DocInventory "https://#####.####.###.##/" | Out-GridView #>
Get-DocInventory "https://#####.####.###.##/" | Export-Csv -NoTypeInformation -Path C:\Users\livob002-lap\Desktop\Permissions-FinanceIntranet.csv

在CSV中将System.Object []的用户名导出为字符串是否可能?名称在GridView中显示正常。


你尝试过子表达式吗?https://blogs.technet.microsoft.com/stefan_stranger/2013/09/25/powershell-sub-expressions/和https://dev59.com/X4Xca4cB1Zd3GeqPF0V_有更多相关信息。$Permission = "Member: " + $($roleAssignment.Member.LoginName) + " Role: " + $($roleDefinition.Name)。谢谢,Tim。 - Tim Haintz
3个回答

9

我所需要做的只是:

$mystring = $myobject | Out-String

这让我轻松地将服务器列表转换为可附加在电子邮件中的字符串。在其他地方找到这个真是费了九牛二虎之力。 :) - Peter Schott

5
有几种方法可以避免这种情况发生。
  1. Using –Join

    [pscustomobject]@{
       Value = (@(1,3,5,6) -join ',')
    } | Export-Csv -notype output.csv
    
  2. Out-String and Trim()

    [pscustomobject]@{
        Value = (@(1,3,5,6) | Out-String).Trim()
    } | Export-Csv -notype output.csv
    

参考资料:使用Export-Csv时避免出现System.Object[](或类似输出)


这篇文章介绍了如何在使用PowerShell的Export-Csv命令时,避免出现System.Object[](或类似输出)。如果你不小心遇到了这个问题,本文提供了一些解决方法。

1
这篇文章https://learn-powershell.net/2014/01/24/avoiding-system-object-or-similar-output-when-using-export-csv/详细讲述了此事,我认为我们需要给作者以荣誉。 - KranthiKiran
现在就给它吧 :) - Ranadip Dutta

4
foreach语句返回一个数组,因此该行代码
"Permissions" = foreach($roleAssignment in $item.RoleAssignments)

将一个System.Array分配给键“Permissions”。System.Array的ToString()方法返回System.Object[]。

您可以使用-join运算符将字符串数组“转换”为字符串。以下内容可能有效。

"Permissions" = foreach($roleAssignment in $item.RoleAssignments)
{
    ...
} -join ', '

2
你需要将 foreach 块包装在子表达式 $(foreach($item in $list){$item})-join', ' 中,以便 -join 操作应用于输出。 - Mathias R. Jessen
@Andreas 谢谢,但是 CSV 文件的输出仍然是相同的。已更新代码。 - Brian
@MathiasR.Jessen,您能详细解释一下吗? - Brian
foreach循环语句不是一个值表达式,最后的}有效地终止了该语句,因此-join ', '最终只是一个一元操作符,输出, - Mathias R. Jessen
@MathiasR.Jessen 谢谢! - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接