获取计算表达式以在 Powershell Exchange 命令中正确显示

Getting Calculated Expression to Display Properly in Powershell Exchange Command

所以我有一个命令来查看我环境中的所有邮箱和 return 任何文件夹中最旧的项目,该文件夹不是该特定邮箱的 "Contacts" 文件夹。除了我在命令末尾输入的计算表达式外,整个事情似乎都有效:

@{Name="Address";Expression={Get-Mailbox | ForEach-Object {$_.PrimarySmtpAddress}

问题是这似乎 return 每个 line/object 的每个 Smtp 地址,而不是每个 line/object.

的一个 Smtp 地址

完整命令如下:

Get-Mailbox | ForEach-Object {Get-MailboxFolderStatistics -IncludeOldestandNewestItems -Identity $_.Alias | Where-Object {($_.OldestItemReceivedDate -ne $null) -and ($_.FolderPath -ne "/Contacts")} | Sort OldestItemReceivedDate | Select First 1 OldestItemReceivedDate, Identity, @{Name="Address";Expression={Get-Mailbox | ForEach-Object {$_.PrimarySmptAddress}}}}

理想情况下,这将 return 最旧项目的日期、找到它的文件夹和主要 SMTP 地址,但它似乎并不只提取相应的 SMTP 地址。看起来它在每次迭代中都拉出每个主 SMTP 地址。我确定这与我的命令有关,但我不知道在哪里。任何帮助将不胜感激。

计算表达式可以访问当前管道对象。但是,您在创建表达式时并未使用它。如您所见,您只是为每个用户调用 every 邮箱。使用带有 $_ 的当前管道对象。 Get-Mailbox 足够聪明,可以通过 属性 名称匹配所需的值。

 @{Name="Address";Expression={Get-Mailbox $_ | ForEach-Object {$_.PrimarySmtpAddress}}}}

但是您可以采用不同的方式来解决这个问题。您已经在管道开始时调用了所有邮箱。没有意义再次调用它。

Get-Mailbox | Select-Object Identity, @{Name="Address";Expression={$_.PrimarySmtpAddress}}, @{Name="OldestItemReceivedDate";Expression={
    Get-MailboxFolderStatistics -IncludeOldestandNewestItems -Identity $_.Alias | Where-Object {
            ($_.OldestItemReceivedDate -ne $null) -and ($_.FolderPath -ne "/Contacts")} | 
            Sort-Object OldestItemReceivedDate | 
            Select-Object -ExpandProperty OldestItemReceivedDate -Last 1      
}}

现在我们有 2 个计算属性,我们只需要为每个用户调用一次 Get-Mailbox。你有一些我试图修复的拼写错误和逻辑错误。你会知道它是否做你想要的。