【问题标题】:Create enough headers to accommodate all results创建足够的标题以容纳所有结果
【发布时间】:2015-05-29 10:20:41
【问题描述】:

我的脚本在这里:

$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 字段的邮箱。

【问题讨论】:

  • 您打算如何处理导出的数据?如果要导出为 CSV,通常创建具有可变数量属性的对象不是一个好主意。您可以通过使用(不同的)分隔符连接元素来创建“多值”字段,以便在重新导入数据时轻松拆分元素。
  • 附录:将数据粘贴到 Excel 时,您可以使用Text to Columns 来拆分具有分隔值的列。您只需要确保数据列右侧有足够的空白列(这样您就不会覆盖其他值)。
  • 一开始我也觉得有些不对劲。你有一个名为 $UserPrincipalName 的变量,但我看不到你在哪里填充它。
  • @Matt 这是我之前回答中的复制/粘贴错误。在这里和那里固定。

标签: powershell powershell-3.0 office365 export-to-csv


【解决方案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 来拆分具有分隔值的列。您只需要确保在您的数据列右侧有足够的空白列(这样您就不会覆盖其他值)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多