从group-object中选择max

时间:2014-01-16 02:44:10

标签: powershell-v3.0

我希望对powershell中的文件数组执行以下操作(以伪SQL表示)

select NAME, max(lastcreatedDate) from listOfFiles
group by NAME

我可以使用group-object cmdlet来完成组,但是如何获得最大位?

注意也许是Measure-Object cmdlet,但我似乎无法让它来处理群组

2 个答案:

答案 0 :(得分:4)

鉴于下面的评论,我猜你的文件列表来自递归文件搜索,最后你想要每个文件名的最新文件的FileInfo对象。请更新您的问题(除了您已经拥有的内容之外,至少预期的输入(如果我的猜测是正确的,它是Get-ChildItem -Recurse -File给出的文件列表)和请求的输出(再次,我的猜测是你想要一个FileInfo对象作为每个文件名的最新文件,如果旧文件存在于其他子文件夹中没有重复))以便将来的读者知道我的猜测是否正确。

鉴于我已正确理解您的场景,我可能会按名称分组,然后在组列表上执行Foreach以从每个组中选择最新文件。为了测试它,我创建了一个文件结构,如下所示:

    Directory: C:\temp


Mode                LastWriteTime     Length Name                               
----                -------------     ------ ----                               
-a---        2014-01-18     14:13          0 file1.txt                          
-a---        2014-01-18     14:19          2 file2.txt                          


    Directory: C:\temp\subfolder


Mode                LastWriteTime     Length Name                               
----                -------------     ------ ----                               
-a---        2014-01-18     14:14          2 file1.txt                          
-a---        2014-01-18     14:14          1 file2.txt                          
-a---        2014-01-18     14:14          0 file3.txt  

我们可以看到,要获取每个文件名的最新文件,我们需要来自子文件夹的file1.txt和file3.txt以及来自C:\ temp根文件夹的file2.txt。

然后运行以下命令:

$files = Get-ChildItem -Path "C:\temp" -Recurse -File

$newestFiles = $files | Group Name | Foreach { $_.Group | Sort CreationTime -Descending | Select -First 1 }
$newestFiles

其中给出了以下输出:

    Directory: C:\temp\subfolder


Mode                LastWriteTime     Length Name                               
----                -------------     ------ ----                               
-a---        2014-01-18     14:14          2 file1.txt                          


    Directory: C:\temp


Mode                LastWriteTime     Length Name                               
----                -------------     ------ ----                               
-a---        2014-01-18     14:19          2 file2.txt                          


    Directory: C:\temp\subfolder


Mode                LastWriteTime     Length Name                               
----                -------------     ------ ----                               
-a---        2014-01-18     14:14          0 file3.txt   

我们想要的输出是什么。 $newestFiles中的每个项都是FileInfo对象,因此它们具有FileInfo对象的所有属性,例如FullName和CreationTime。

答案 1 :(得分:0)

这是解决此问题的更一般的方法。等效于此SQL:

# SELECT filename, max(date) FROM ListOfFiles GROUP BY filename 

$ListOfFiles |
Sort-Object -Property filename | group filename |
%{[PSCustomObject]@{
     filename = $_.name;
     max_date = ($_.Group | Sort-Object date | select -Last 1 -Property date).date; 
}}

因此,我们首先按照主属性对列表进行排序和分组,然后针对结果的每个记录从.Group属性中提取我们关心的额外字段。