Экспорт пользовательского объекта PowerShell в CSV
Я хочу создать полный отчет о разрешении почтового ящика и экспортировать его в CSV в PowerShell.
$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
}
Сетка показывает именно то, что я хочу, но мне трудно заставить его правильно экспортировать в CSV.
4 ответа
Я точно знаю, что это может быть как лучше, так и лучше соответствовать вашему конкретному случаю, но решил, что им все же стоит поделиться.
Вы можете получить Import-Excel
модуль, который позволяет легко создавать и форматировать файлы Excel. Вы можете установить его из галереи Powershell, расположенной здесь. Это в основном предполагает, что ваши листы предназначены только для человеческих глаз, и учитывая формат, я думаю, я могу сказать с некоторой степенью уверенности, что это правда.
Сначала я начал собирать все объекты перед добавлением, что я считаю довольно распространенной ошибкой. Просто выведите объект напрямую и соберите его в переменную.
$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
Командлет для создания объекта 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()
Можете ли вы попробовать это
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/ Similar- output- when- using- export- csv/
Чтобы преобразовать объект, вы можете использовать pipe в результате выбора в ConvertTo-Csv, например так:
$selectResult = $mailboxObject | select identity, users, accessrights, sendas, sendonbehalf
$selectResult | out-gridview
$selectResult | ConvertTo-Csv > .\mailbox.csv
Экспорт-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*