从组对象中选择最大值

soa*_*dos 4 powershell-3.0

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

select NAME, max(lastcreatedDate) from listOfFiles
group by NAME
Run Code Online (Sandbox Code Playgroud)

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

注意也许是Measure-Objectcmdlet,但我似乎无法让它处理组

Rob*_*und 5

鉴于您下面的评论,我猜您的文件列表来自递归文件搜索,最后您想要每个文件名的最新文件的 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  
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,为了获取每个文件名的最新文件,我们需要子文件夹中的 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
Run Code Online (Sandbox Code Playgroud)

给出了以下输出:

    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   
Run Code Online (Sandbox Code Playgroud)

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


nde*_*mou 5

这是此问题的更通用的解决方案。它相当于以下 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; 
}}
Run Code Online (Sandbox Code Playgroud)

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