2016-12-05 47 views
0

我使用下面的代码检索并同时为EmailAddresses属性中的每个smtp属性添加分隔符“,”。PowerShell检索和排序EmailAddresses

get-mailbox | select-object DisplayName,PrimarySMTPAddress, @{Name='EmailAddresses';Expression={[string]::join(", ", ($_.EmailAddresses))}} 

但我也想的EmailAddressess值,这样大写永远是第一位使用PowerShell和尽可能少的努力(短码)尽可能排序。

如果您不熟悉Microsoft Exchange:EmailAddresses中的每个值首先以smtp:SMTP:开头,后面跟着用户的各种电子邮件地址。大写的SMTP意味着它是发送电子邮件时使用的主要SMTP地址。小写smtp意味着它只是另一个电子邮件地址。

我想对输出进行排序,以便SMTP:*值最先。

奖励问题,在Expression -block;怎么样可以将多个[string]::重载一起使用?

我试图通过使用[string]::OrderBy()[string]::OrderByDescending()来实现排序的输出,但我无法弄清楚如何将它们与[string]::split()一起使用。

感谢用户4c74356b41,我现在意识到我的字符串不包含OrderBy()OrderByDescending(),因此它们不能使用。

MSDN: OrderBy Method
MSDN: OrderbyDescending Method

+0

字符串不包含'OrderByDescending()'或'OrderBy()' – 4c74356b41

+0

这就解释了它。谢谢。 – NiklasJ

+0

你可以使用'Sort-Object'在PowerShell中排序。像这样:'$ a = @('b','A'); $ a | Sort-Object' – 4c74356b41

回答

-1

你可以嵌套管道内部排序的表达。

@{Name='EmailAddresses';Expression={[string]::join(", ", ($_.EmailAddresses | Sort-Object))}} 

99%肯定这会为你工作,但并没有嘲笑了一个完整的测试,以确保所以让我知道,如果它失败。

+0

我从来没有尝试过那种排序对象的位置。然而,这是一个不起作用的例子:'... Expression = {[string] :: join(“,”,($ _。EmailAddresses))| Sort-Object -Property EmailAddresses}}'我明天试试你的建议。 – NiklasJ

+0

当你到达该管道的排序阶段时,你已经建立了你的对象数组,然后你要求管道根据每个对象的EmailAddresses属性对整个数组进行排序,所以您将自己排序对象,而不是电子邮件,将表达排序到表达式中,然后将它们添加到添加到数组中的对象之前对电子邮件进行排序。如果你运行它,我的代码是否工作? –

+0

我已经试过了,不幸的是它不工作。我尝试过不同的方法,没有一个真的很完美。奇怪的是,对象排序不同,但SMTP:*不会在所有情况下首先出现。 '... Expression = {[string] :: join(“,”,($ _。EmailAddresses | Sort-Object -Property EmailAddresses))}}' and: '... Expression = {[string] :: join(“,”,($ _。EmailAddresses | Sort-Object -CaseSensitive))}}' and: '... Expression = {[string] :: join(“,”,($ _。 EmailAddresses | Sort-Object -CaseSensitive-Descending))}}' – NiklasJ