【问题标题】:Export custom PowerShell object to CSV将自定义 PowerShell 对象导出到 CSV
【发布时间】:2018-10-03 14:53:03
【问题描述】:

我想创建一个完整的邮箱权限报告并将其导出到 PowerShell 中的 CSV。

$report = @()
$mailboxes = Get-Mailbox -ResultSize unlimited -RecipientTypeDetails sharedmailbox

foreach ($mailbox in $mailboxes)
{ 
    $permissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-MailboxPermission | Select-Object user, accessrights
    $users = $permissions.user
    $accessRights = $permissions.accessrights
    $sendAsPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-ADPermission | Where-Object {$_.extendedrights -eq "send-as"} | select -ExpandProperty user
    $sendOnBehalfPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | select -ExpandProperty grantsendonbehalfto

    $properties = @{
    Identity = $mailbox.PrimarySmtpAddress
    Users = ($permissions.user -join "`n")
    AccessRights = ($permissions.accessrights -join "`n")
    SendAs = ($sendAsPermissions -join "`n")  
    SendOnBehalf = ($sendOnBehalfPermissions -join "`n")
    }

    $mailboxObject = New-Object -TypeName psobject -Property $properties

    #$mailboxObject | select identity, users, accessrights | Export-Csv -Append -NoTypeInformation -Path c:\temp\test.csv
    $mailboxObject | select identity, users, accessrights, sendas, sendonbehalf | out-gridview
}

gridview 准确显示了我想要的内容,但我很难将其正确导出到 CSV。

【问题讨论】:

  • CSV 有什么问题?
  • 在 CSV 中,'users' 列的第一条记录放置在 'users' 列中,但所有后续记录都放置在 'identity' 列中。我似乎无法让 CSV 与 Out-Gridview 匹配。
  • 您好尝试在 $mailboxobject 上将 psobject 替换为 pscustomobject
  • 为什么需要这样的 CSV 输出?在 csv 中存储换行符分隔的字符串会产生奇怪的输出。这就是换行符出现在文件中的方式。我不认为你想要的会起作用。话虽如此,如果您显示 csv 的外观以及您希望它的外观,可能会更容易。我会选择将数组扁平化为分号字符串以允许每个身份输入一个条目,或者为每个权限创建一行并复制身份列,这样在查看一个权限条目时数据不会丢失。
  • 您基本上是要求在 csv 输出中插入任意空格以获得更多表格输出吗? csv 格式正确,PowerShell(和其他应用程序)按原样正确读取。更改它会将不需要的数据引入输出,从而影响其读取方式。

标签: powershell exchange-server export-csv


【解决方案1】:

事实上,我知道这可能会更好,更适合您的具体情况,但我认为它仍然值得分享。

您可以获得Import-Excel 模块,该模块可让您轻松创建和格式化 Excel 文件。您可以从 Powershell Gallery located here 安装它。这基本上是假设您的表格仅供人眼使用,并且考虑到格式,我想我可以肯定地说这是真的。

首先,我首先在追加之前收集所有对象,我认为这是一个很常见的错误。直接输出对象,收集到变量中即可。

$report = @()
$mailboxes = Get-Mailbox -ResultSize unlimited -RecipientTypeDetails sharedmailbox

$collectOutput = foreach ($mailbox in $mailboxes)
{ 
  $permissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-MailboxPermission | Select-Object user, accessrights
  $users = $permissions.user
  $accessRights = $permissions.accessrights
  $sendAsPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Get-ADPermission | 
    Where-Object {
      $_.extendedrights -eq 'send-as'
    } | Select-Object -ExpandProperty user
  $sendOnBehalfPermissions = Get-Mailbox $mailbox.PrimarySmtpAddress | Select-Object -ExpandProperty grantsendonbehalfto

  [pscustomobject]@{
    Identity     = $mailbox.PrimarySmtpAddress
    Users        = ($permissions.user -join "`r`n")
    AccessRights = ($permissions.accessrights -join "`r`n")
    SendAs       = ($sendAsPermissions -join "`r`n")
    SendOnBehalf = ($sendOnBehalfPermissions -join "`r`n")
  }
}

现在我将使用Export-Excel cmdlet 生成一个OfficeOpenXml.ExcelPackage 对象,然后我们可以使用一些辅助函数对其进行操作。我发现这几乎模仿了Out-Gridview。标头换行有点偏离,但欢迎您尝试不同的参数,直到找到适合您的参数。

$sheet = $collectOutput | Export-Excel -Path 'C:\Users\username\Desktop\testing.xlsx' -PassThru -AutoSize

$sheet.Sheet1.Column(1) | Set-ExcelRange -VerticalAlignment Center
$sheet.Sheet1.Column(2) | Set-ExcelRange -WrapText
$sheet.Sheet1.Column(3) | Set-ExcelRange -WrapText
$sheet.Sheet1.Column(4) | Set-ExcelRange -WrapText

$sheet.Save()
$sheet.Dispose()

【讨论】:

  • 这真的有必要吗?输出确实在 Excel 上为我打开了,无需走这条路。
  • 这完全取决于 OP 想要什么,但至少需要一些对齐的东西。 @Matt 对我来说,默认情况下单元格不会仅使用 CSV 扩展。
【解决方案2】:

Export-Csv 就是为了这个。

这是一个工作示例:

$o = [PSCustomObject]@{a = 1 } ,
     [PSCustomObject]@{a = 2 }

# Export     
$o | Export-Csv -Path a.csv

# check the file
Get-Content ./a.csv

要查找使用 csv 的命令,您可以使用

Get-Command *csv*

【讨论】:

    【解决方案3】:

    要将可能在选择结果上使用管道的对象转换为 ConvertTo-Csv,如下所示:

      $selectResult = $mailboxObject | select identity, users, accessrights, sendas, sendonbehalf
      $selectResult | out-gridview
      $selectResult | ConvertTo-Csv > .\mailbox.csv
    

    【讨论】:

      【解决方案4】:

      你可以试试这个

      Identity = $mailbox.PrimarySmtpAddress
      Users = (@($permissions.user -join "`n") |Out-String).Trim()
      AccessRights = (@($permissions.accessrights -join "`n")|Out-String).Trim()
      SendAs = (@($sendAsPermissions -join "`n") |Out-String).Trim() 
      SendOnBehalf =(@($sendOnBehalfPermissions -join "`n")|Out-String).Trim()
      

      **你可以看看这个网站**https://learn-powershell.net/2014/01/24/avoiding-system-object-or-similar-output-when-using-export-csv/

      【讨论】:

        猜你喜欢
        • 2021-08-17
        • 2017-11-30
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        相关资源
        最近更新 更多