Powershell格式表或选择对象仅显示最佳结果

时间:2013-12-04 19:22:24

标签: sorting powershell formatting exchange-server-2007

我正在尝试查找发送最多电子邮件的用户。 但最后我只想显示前10位(或n位数)的发件人。 有没有办法只使用select-object或format-table

显示最佳结果
$Messages = Get-ExchangeServer * | where{$_.ServerRole -eq "HubTransport"} | %{get-messagetrackinglog -server $_.name -EventID "SEND" -Start (get-date -format G).AddDays(-1) -ResultSize unlimited}) 2>&1 | out-null

$messages | where{$_.sender -like "*@OurDomain.com*"} | select sender | group sender | sort count -Descending | ft count,name

有没有办法让这只显示最佳结果?

我能想到的唯一方法是将它们存储在一个变量中,然后在for循环中输出它们

2 个答案:

答案 0 :(得分:5)

ft之前,添加:

select -first 10

将10改为你想要多少。

所以完整的命令是:

$messages | where{$_.sender -like "*@OurDomain.com*"} | select sender | group sender | sort count -Descending | select -first 10 | ft count,name

答案 1 :(得分:0)

这是很久以前问的。但是令我惊讶的是,您正在使用select并且没有看这件事。好吧,如果您认为这是一个不礼貌的答案-不会。关键是您正接近解决方案。几天后(顺便说一句,我对Powershell的了解不多),我被问到了这个问题,我只需要显示前几个问题。因此,我做的第一件事是get-help *display*认为它将以某种方式向我展示一些东西,从而使我可以展示一些东西。我错了,意识到我需要寻找一些东西。然后,我寻找动作词或动词。我检查了get-Verb,然后看到了相关的动词。

我找到了select。听起来很合理,然后我打开了select的帮助。 get-help select -ShowWindow。然后我检查了参数并找到了


    -First <Int32>
        Gets only the specified number of objects. Enter the number of objects to get.

        Required?                    false
        Position?                    named
        Default value                False
        Accept pipeline input?       False
        Accept wildcard characters?  false

就是这样。我对电源外壳一无所知,但我猜想仍然可以通过这样的锻炼找到。

对于您来说,您知道它将是select,因此您可以轻松地检查参数来解决它。实际上,即使有关如何做事的示例也很有帮助。例如,在发现First之后,我得到了这个例子,使我对语法有了清晰的认识。

PS C:\>Get-Process | Sort-Object -Property WS | Select-Object -Last 5 

    Handles  NPM(K)    PM(K)      WS(K) VS(M)   CPU(s)     Id ProcessName
    -------  ------    -----      ----- -----   ------     -- -----------
    2866     320       33432      45764   203   222.41   1292 svchost
    577      17        23676      50516   265    50.58   4388 WINWORD
    826      11        75448      76712   188    19.77   3780 Ps
    1367     14        73152      88736   216    61.69    676 Ps
    1612     44        66080      92780   380   900.59   6132 INFOPATH

是的,这也可以是第一个,而我做到了并得到了结果。

PS C:\WINDOWS\system32> Get-Process | Sort-Object -Property WS | Select-Object -First 5

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
      0       0       60          8                 0   0 Idle
    841      39    22988          8       0.69   2540   3 SystemSettings
    538      38    17900         36       0.97  12636   3 WinStore.App
    452      29    16568         44       0.81  25724   3 Video.UI
    181      11     1800        832       0.08   6544   0 GoogleCrashHandler

注意::上一个答案很棒,并显示了OP所需的一切。我只是在展示解决同一件事的方式。