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

时间:2016-04-29 13:36:02

标签: email powershell exchange-server

所以我有一个命令来查看我环境中的所有邮箱,并返回任何不是"联系人"的文件夹中最旧的项目。该特定邮箱的文件夹。除了在命令结尾处输入的计算表达式外,整个过程似乎都有效:

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

问题是这似乎返回每个行/对象的每个Smtp地址,而不是每行/对象一个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}}}}

理想情况下,这将返回最旧项目的日期,找到它的文件夹以及主SMTP地址,但它似乎不会仅提取相应的SMTP地址。看起来它每次迭代都会拉动每个主SMTP地址。我确定这是我的命令,但我无法弄清楚在哪里。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

计算的表达式可以访问当前管道对象。但是,在创建表达式时,您没有使用它。您正在为每个用户调用每个邮箱,如您所见。将当前管道对象与$_一起使用。 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一次。您尝试修复了一些拼写错误和逻辑错误。你会知道它是否符合你的要求。