在目录中查找最新文件,然后选择具有相同DateTime

时间:2016-11-21 12:18:32

标签: powershell

使用此命令,我可以在目录中搜索最新文件:

gci C:\temp | sort LastWriteTime -descending | select -first 1

我的目录相当大,包含60'000 + txt文件。运行此命令需要:

PS C:\xy> measure-command {gci C:\temp | sort LastWriteTime -descending | select -first 1}


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 13
Milliseconds      : 465
Ticks             : 134657703
TotalDays         : 0.000155853822916667
TotalHours        : 0.00374049175
TotalMinutes      : 0.224429505
TotalSeconds      : 13.4657703
TotalMilliseconds : 13465.7703

如您所见,此命令需要很长时间才能完成。

我的任务是获取与命令返回的文件具有相同LastWriteTime属性的所有文件(到分钟)。

我试过这样的事情:

$file = gci C:\temp -OutVariable files | sort LastWriteTime -descending | 
        select -first 1 | % { $_.LastWriteTime }
$myfiles = $files | ? {$_.LastWriteTime -like $file}

当我比较找到LastWriteTime的$file和应该包含具有相同LastWriteTime的所有文件的$myfiles时,$myfiles总是只包含一个文件 - 这是因为秒是每个对象都有所不同:

PS C:\xy> $file

Montag, 21. November 2016 13:10:08

如何通过比较lastwritetime属性找到我需要的文件?

4 个答案:

答案 0 :(得分:2)

  

$myfiles始终只包含一个文件 - 这是因为秒数   每个对象都有所不同:

然后只比较您感兴趣的时间戳部分 - 在本例中我们将比较分钟:

$Timestamp = $file.ToString('yyyyMMddHHmm')

$myfiles = $files | ? {$_.LastWriteTime.ToString('yyyyMMddHHmm') -eq $file}

答案 1 :(得分:1)

我认为您只需比较年,月,日,小时和分钟

$myfiles = $files | ? {$_.LastWriteTime.Year -eq $file.Year `
                     -and $_.LastWriteTime.Month -eq $file.Month `
                     -and $_.LastWriteTime.Day -eq $file.Day `
                     -and $_.LastWriteTime.Hour -eq $file.Hour `
                     -and $_.LastWriteTime.Minute -eq $file.Minute }

答案 2 :(得分:0)

好像你只想要时间而不是日期,所以,我会利用一个FileInfo方法来简化比较。

抓住你所追求的时间:

$time = (Get-ChildItem -Path C:\temp -Filter "*.txt" | Sort-Object LastWriteTime -Descending | Select-Object -First 1).LastWriteTime.ToShortTimeString()

然后,抓取匹配的文件:

Get-ChildItem -Path C:\temp -Filter "*.txt" | Sort-Object LastWriteTime | Where-Object { $_.LastWriteTime.ToShortTimeString() -eq $time }

答案 3 :(得分:-1)

一些想法可能至少可以加快速度。 你不确定他们会达到多少。 这没有经过测试,因此可能包含错误;)

$file = ((gci C:\temp -OutVariable files).LastWriteTime | sort -Descending)[0]

$myfiles = $files.Where{$_.LastWriteTime -match $file}