Powershell:比较数组中的多个值

Sea*_*ner 1 arrays powershell comparison

我对Powershell有另一个棘手的问题.我有一个约4000个条目的列表,其中我有以下详细信息:

<Computername> | <Username> | <StartDate> | <LastDate> | <IDNum>
computer1      | jsmith     | 4/12/12     | 4/12/13    | 52648
computer1      | jsmith     | 4/12/12     | -          | 52649
computer1      | jsmith     | 4/12/12     | 8/7/13     | 52644
computer2      | hreid      | 2/5/12      | 8/5/13     | 52396
computer2      | hreid      | 4/10/12     | 5/18/13    | 52300
computer3      | mdrake     | 2/10/11     | 12/18/12   | 52590
computer3      | mdrake     | 5/10/11     | 3/20/12    | 52593
Run Code Online (Sandbox Code Playgroud)

它是一个CSV,我试图找到一种比较Computername和LastDate字段的方法,并吐出最近一行的列表以及相关的computername值.我能够将CSV读入变量,但是我对get-member值和每个循环都有一段时间.

理想情况下,输出看起来像这样:

<Computername> | <Username> | <StartDate> | <LastDate> | <IDNum>
computer1      | jsmith     | 4/12/12     | 8/7/13     | 52644
computer2      | hreid      | 2/5/12      | 8/5/13     | 52396
computer3      | mdrake     | 5/10/11     | 3/20/12    | 52593
Run Code Online (Sandbox Code Playgroud)

有点复杂......我真的无法在脑海中打破这种局面.有帮助吗?甚至关于我如何开始编写脚本的想法......我在这里打了一堵墙.

--Update--

谢谢Rynant.所以我发现显然我的源列表有点复杂.它缺少列表中的一些计算机名称...此外它还缺少一些lastdate条目.所以我需要改变原始列表看起来更像这样:

<Computername> | <Username> | <StartDate> | <LastDate> | <IDNum>
computer1      | jsmith     | 4/12/12     | 4/12/13    | 52648
computer1      | jsmith     | 4/12/12     | -          | 52649
computer1      | jsmith     | 4/12/12     | 8/7/13     | 52644
computer2      | hreid      | 2/5/12      | 8/5/13     | 52396
computer2      | hreid      | 4/10/12     | 5/18/13    | 52300
computer3      | mdrake     | 2/10/11     | 12/18/12   | 52590
computer3      | mdrake     | 5/10/11     | 3/20/12    | 52593
               | fmann      | 4/11/12     | 3/20/13    | 52342
Run Code Online (Sandbox Code Playgroud)

我将尝试使用您的代码示例,看看我是如何做的.我对这个来源列表感到非常恼火,因为我发现某些条目缺少各种各样的东西......唉.

Ryn*_*ant 5

您可以按Computername进行分组,然后对每个组进行分组,按LastDate排序并选择最后一项.

您必须进行调整以满足您的格式需求,但它看起来像这样.

Import-Csv -Path .\computers.csv|
    group -Property Computername|
    foreach {
        $_.group|
            sort { try { [datetime]$_.LastDate } catch {} }|
            select -last 1
    }|
    Export-Csv -Path .\computers_LastDate.csv -NoTypeInformation
Run Code Online (Sandbox Code Playgroud)