我希望对 powershell 中的文件数组执行以下操作(以伪 SQL 表示)
select NAME, max(lastcreatedDate) from listOfFiles
group by NAME
Run Code Online (Sandbox Code Playgroud)
我可以使用group-objectcmdlet 来完成分组,但如何获得最大位?
注意也许是Measure-Objectcmdlet,但我似乎无法让它处理组
鉴于您下面的评论,我猜您的文件列表来自递归文件搜索,最后您想要每个文件名的最新文件的 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。
这是此问题的更通用的解决方案。它相当于以下 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。
| 归档时间: |
|
| 查看次数: |
6092 次 |
| 最近记录: |