创建足够的标头以容纳所有结果

时间:2015-05-29 10:20:42

标签: powershell powershell-v3.0 office365 export-to-csv

我的脚本在这里:

$Results = @()
Get-Mailbox | % {
  $o = New-Object -Type PSCustomObject -Property @{
         'DisplayName'         = $_.DisplayName
         'alias'               = $_.alias
         'UserPrincipalName'   = $_.UserPrincipalName
         'PrimarySmtpAddress'  = $_.PrimarySmtpAddress
         'PrimaryProxyAddress' = ($_.EmailAddresses) -cmatch "SMTP:" -replace '^smtp:' -join ' ' 
       }

  $i = 1
  $_.EmailAddresses -cmatch "smtp:" | % {
    $o | Add-Member -Type NoteProperty -Name "OtherProxyAddress$i" `
      -Value ($_ -replace '^smtp:')
    $i++
  }

  $Results += $o
}

$results| ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | clip

问题是当我转换为CSV时。转换为CSV时,第一个邮箱需要有多少OtherProxyAddress。如果第一个邮箱中有两个OtherProxyAddress,它将使用此选项并继续创建CSV文件的标题。但是,某些邮箱可能包含2个OtherProxyAddress个字段。在这种情况下,当我在Excel中打开CSV时,我会错过具有两个以上OtherProxyAddress字段的邮箱的其他条目。

我希望能够以CSV格式捕获,因此我可以在Excel中粘贴足够的标题,使邮箱与OtherProxyAddress个字段最匹配。

1 个答案:

答案 0 :(得分:1)

不是我最好的工作,但它似乎完成了工作。我想我可能已经改变了你想要的属性,但我需要重新安排一些东西以获得动态的部分工作。

$all = Get-Mailbox
$maxProxyIndex = $all | Select EmailAddresses | Where-Object{$_.EmailAddresses -cmatch "smtp"} | ForEach-Object{
    ($_.EmailAddresses -split "," | Where-Object{$_  -cmatch "smtp"} | Measure-Object).Count
} | Measure-Object -Maximum | Select -ExpandProperty Maximum

$propertyOrder = "DisplayName","Alias","UserPrincipalName","PrimarySmtpAddress" + (1..$maxProxyIndex | ForEach-Object{"ProxyAddress$_"})

$all | ForEach-Object{
    $props = @{
         'DisplayName'         = $_.DisplayName
         'alias'               = $_.alias
         'UserPrincipalName'   = $_.UserPrincipalName
         'PrimarySmtpAddress'  = $_.PrimarySmtpAddress
       }
    $proxyAddresses = @(($_.EmailAddresses -split ","| Where-Object{$_  -cmatch "smtp"})) -replace "^smtp:"
    For($proxyIndex = 1; $proxyIndex -le $maxProxyIndex;$proxyIndex++){
        $props."ProxyAddress$proxyIndex" = If($proxyAddresses){$proxyAddresses[$proxyIndex - 1]}
    }

    New-Object -TypeName PSCustomObject -Property $props
} | Select-Object $propertyOrder | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Clip

首先,就像你说的那样,我们需要找出代理地址数最多的邮箱,这是$maxProxyIndex。我们收集所有邮箱数据,因为我们需要解析它两次。一次为最大索引,第二次为整体输出。

对于$maxProxyIndex,我们会获取每个邮箱的emailaddresses并过滤次要的smtp电子邮件。然后我们使用Measure-Object -Maximum来获取神奇数字。

当我们在主循环中创建对象输出时,我们需要始终创建其他代理属性,即使它们不存在。

您将看到我们正在使用$propertyOrder,这很重要,因为动态创建属性不会在输出中提供正确的顺序。

Ansgar Wiechers' Comment

这些都不是必需的,因为您可以利用Excel功能来实现类似的目标。根据他的评论:

  

附录:将数据粘贴到Excel中时,可以使用Text to Columns拆分带有分隔值的列。您只需确保在数据栏右侧有足够的空白列(因此您不会覆盖其他值)