PowerShell获取目录中最近的文件

107

我们生成带有日期名称的文件。 (*下面是日期的通配符) 我想获取最后一个文件,包含该文件的文件夹标题中也包含日期(仅限月份)。

我正在使用PowerShell,并计划每天运行它。以下是目前的脚本:

  $LastFile = *_DailyFile
  $compareDate = (Get-Date).AddDays(-1)
  $LastFileCaptured = Get-ChildItem -Recurse | Where-Object {$LastFile.LastWriteTime        
         -ge $compareDate}
5个回答

222

如果你想获取目录中最新的文件,并且仅使用 LastWriteTime 确定最新的文件,你可以按照以下方式操作:

gci path | sort LastWriteTime | select -last 1

另一方面,如果你只想依赖于那些名字中带有日期的部分,你应该能够做类似的事情。

gci path | select -last 1

另外,如果目录中有子目录,您可能需要添加一个 ?{-not $_.PsIsContainer}


@user977645 记得点击上投票/下投票箭头左侧的v标志接受此答案。 - CB.
互联网上有一个谣言说“LastAccessTime”可以解决这个问题。这是假的。你的解决方案才是正确的。 - Flat Cat
1
抱歉snowcode,如果我误解了你的帖子,但我认为你是错误的。最新的文件是通过-last 1接收的,而不是first 1。我亲自测试过,我有今天最新的文件和2019年最旧的文件。当我使用-last 1运行上面的代码时,我确实得到了今天的文件。当我将其更改为-first 1时,我得到了最古老的文件,即来自2019年的文件。 - TelluRye
2
如果您只想要文件,请使用“-file”。 - Timo
一旦我们使用上述可接受的代码获取文件,那么我们如何将其复制到其他地方呢? - nkormanik
显示剩余5条评论

13

试一试:

$latest = (Get-ChildItem -Attributes !Directory | Sort-Object -Descending -Property LastWriteTime | select -First 1)
$latest_filename = $latest.Name 

说明:

PS C:\Temp> Get-ChildItem -Attributes !Directory *.txt | Sort-Object -Descending -Property LastWriteTime | select -First 1


    Directory: C:\Temp


Mode                LastWriteTime         Length Name                                                                                
----                -------------         ------ ----                                                                                
-a----         5/7/2021   5:51 PM           1802 Prison_Mike_autobiography.txt                    
  • Get-ChildItem -Attributes !Directory *.txtGet-ChildItemgci:获取当前目录下文件列表,我们还可以根据需要添加一个文件扩展名过滤器,例如*.txt。参考:gciGet-ChildItem
  • Sort-Object -Descending -Property LastWriteTime:按修改时间(LastWriteTime)降序排列文件。参考:排序对象
  • Select -First 1:获取第一条记录。参考:选择对象/选择

获取文件元数据

PS C:\Temp> $latest.Name
Prison_Mike_autobiography.txt

PS C:\Temp> $latest.DirectoryName
C:\Temp

PS C:\Temp> $latest.FullName
C:\Temp\Prison_Mike_autobiography.txt

PS C:\Temp> $latest.CreationTime
Friday, May 7, 2021 5:51:19 PM


PS C:\Temp> $latest.Mode
-a----


10

是的,我认为这样会更快。

Get-ChildItem $folder | Sort-Object -Descending -Property LastWriteTime -Top 1 

2
我喜欢按降序排序的想法,然后取第一个结果。根据它在幕后的工作方式,这可能在大目录上更快。但你需要管道到选择器。此外,Top是无效的。Get-ChildItem $folder | Sort-Object -Descending -Property LastWriteTime | Select -First 1 - Mark Berry
是的,我的错,-Top 只在 PowerShell 6 中引入。 - Brian Russell

4

@manojlds的答案可能是最适合你只关心根目录内文件的情况:

\path
     \file1
     \file2
     \file3

然而,如果您感兴趣的文件是文件和目录树的一部分,例如:

\path
     \file1
     \file2
     \dir1
         \file3
         \dir2
              \file4

为了在Windows中递归地查找最近修改的10个文件列表,您可以运行:

PS > $Path = pwd # your root directory
PS > $ChildItems = Get-ChildItem $Path -Recurse -File
PS > $ChildItems | Sort-Object LastWriteTime -Descending | Select-Object -First 10 FullName, LastWriteTime


当我尝试查找是否有一个具有许多文件夹的SharePoint库正在被积极使用时,这对我很有效。但是,为了使用脚本,我必须在IE中使用文件资源管理器打开库,返回到站点根目录,在功能区的主页选项卡中单击库文件夹,然后复制路径。 - Jeffrey Quinn

2
你可以尝试按照“sort LastWriteTime -Descending”的方式进行降序排序,然后再使用“select -first 1”选择第一个。不确定哪个更快。将"Original Answer"翻译为"最初的回答"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接