我希望对powershell中的文件数组执行以下操作(以伪SQL表示)
select NAME, max(lastcreatedDate) from listOfFiles
group by NAME
我可以使用group-object
cmdlet来完成组,但是如何获得最大位?
注意也许是Measure-Object
cmdlet,但我似乎无法让它来处理群组
答案 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
属性中提取我们关心的额外字段。