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

Bri*_*ian 8 string powershell sharepoint roles

我创建了一个脚本,该脚本基本上遍历站点及其子站点中的所有列表,并列出每个文档或项目的权限。

\n\n

但是,该脚本可以正常工作,当写入 CSV 文件时,权限(成员 + 角色)字符串将被写入而System.Object[]不是 CSV 输出中的正确字符串(例如Member: user123 Role: Full Control)。

\n\n

示例输出:

\n\n
"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"\n
Run Code Online (Sandbox Code Playgroud)\n\n

下面是脚本:

\n\n
Add-PSSnapin Microsoft.SharePoint.PowerShell\n\nfunction Get-DocInventory([string]$siteUrl) {\n    $site = New-Object Microsoft.SharePoint.SPSite $siteUrl\n\n    $i = 0;\n    foreach ($web in $site.AllWebs) {\n\n        $count = $site.AllWebs.Count\n        foreach ($list in $web.Lists) {\n\n            if ($list.BaseType -ne \xe2\x80\x9cDocumentLibrary\xe2\x80\x9d)\n            {\n               continue\n            }\n\n            foreach ($item in $list.Items) {\n                $data = @{\n                    "Web Application" = $web.ToString()\n                    "Site" = $site.Url\n                    "Web" = $web.Url\n                    "list" = $list.Title\n                    "Item URL" = $item.Url\n                    "Item Title" = $item["Title"]\n                    "Item Created" = $item["Created"]\n                    "Item Modified" = $item["Modified"]\n                    "File Size" = $item.File.Length/1KB\n                    "Permissions" = foreach($roleAssignment in $item.RoleAssignments)\n                    {\n                        $Permission = ""\n\n                        foreach($roleDefinition in $roleAssignment.RoleDefinitionBindings)\n                        {\n                            $Permission = $(foreach($roleAssignment in $item.RoleAssignments){$roleAssignment}\n                            {\n                                "Member: " +  $roleAssignment.Member.LoginName + " Role: " + $roleDefinition.Name + " "\n                            } -join \',\')\n\n                            $Permission\n                            Write-Progress -activity "Working" -status "Checked Sub-Site $i of $count" -percentComplete (($i / $count)/100)\n                        }\n                    }\n                }\n                New-Object PSObject -Property $data\n            }\n        }\n        $web.Dispose();\n    }\n    $i++\n    $site.Dispose()\n}\n<# Get-DocInventory "https://#####.####.###.##/" | Out-GridView #>\nGet-DocInventory "https://#####.####.###.##/" | Export-Csv -NoTypeInformation -Path C:\\Users\\livob002-lap\\Desktop\\Permissions-FinanceIntranet.csv\n
Run Code Online (Sandbox Code Playgroud)\n\n

是否可以将用户名的 System.Object[] 作为字符串导出到 CSV 中?这些名称按其应有的方式显示在 GridView 中。

\n

小智 9

我所要做的就是:

$mystring = $myobject | Out-String
Run Code Online (Sandbox Code Playgroud)


Ran*_*tta 5

有几种方法可以避免它。

\n\n
    \n
  1. 使用\xe2\x80\x93Join

    \n\n
    [pscustomobject]@{\n   Value = (@(1,3,5,6) -join \',\')\n} | Export-Csv -notype output.csv\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. Out-String 和 Trim()

    \n\n
    [pscustomobject]@{\n    Value = (@(1,3,5,6) | Out-String).Trim()\n} | Export-Csv -notype output.csv\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
\n\n

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

\n


小智 4

foreach 语句返回一个数组,因此该行

"Permissions" = foreach($roleAssignment in $item.RoleAssignments)
Run Code Online (Sandbox Code Playgroud)

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

您可以使用 -join 运算符将字符串数组“转换”为字符串。以下可以工作。

"Permissions" = foreach($roleAssignment in $item.RoleAssignments)
{
    ...
} -join ', '
Run Code Online (Sandbox Code Playgroud)

  • 您需要将 `foreach` 块包装在子表达式 `$(foreach($item in $list){$item})-join', '` 中,以便将 `-join` 操作应用于输出 (2认同)