当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 获取目录中最后修改的文件 [ 4 种方法]

作者:精品下载站 日期:2024-12-14 05:30:56 浏览:13 分类:玩电脑

PowerShell 获取目录中最后修改的文件 [ 4 种方法]


[玩转系统] PowerShell 获取目录中最后修改的文件 [ 4 种方法]

对于本文,我们的工作目录将是 C:\Test1,其中包含两个名为 File1.txtFile2.txt 的文件。

Get-ChildItemSort-Object Cmdlet 结合使用

使用 Get-ChildItem cmdlet 和 Sort-Object` cmdlet 来获取 PowerShell 目录中最后修改的文件。 Sort-Object cmdlet 将按 LastWriteTime 属性对 File 对象进行排序。

使用 Get-ChildItem Cmdlet:

Get-ChildItem -Path C:\Test1 |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1

输出 :

Directory: C:\Test1
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         4/20/2023  11:30 PM            315 File1.txt

该代码使用 Get-ChildItem cmdlet 检索指定目录(即 C:\Test)内的文件和目录列表。接下来,Get-ChildItem cmdlet 的结果通过管道符号 (|) 传递到 Sort-Object cmdlet。最后,LastWriteTime 属性(指示文件或目录的上次更新时间)用于使用 Sort-Object cmdlet 对文件和目录列表进行排序。

当使用参数-Descending 对列表进行降序排序时,最近更新的文件或目录位于列表的顶部。接下来,再次使用管道符号将排序后的列表传递给 Select-Object cmdlet。最后,Select-Object cmdlet 检索排序列表中的第一项,即最近修改的文件或目录。参数-First 1 用于指定仅应检索第一项。

如果您想查找目录和子目录中最后修改的文件,可以使用-Recurse选项。

目录和子目录中最后修改的文件:

Get-ChildItem -Path C:\Test1 -Recurse|
Sort-Object LastWriteTime -Descending |
Select-Object -First 1

输出 :

Directory: C:\Test1
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         4/20/2023  11:30 PM            315 File1.txt

Get-Item Cmdlet 与 Sort-Object 结合使用

使用 Get-ChildItem cmdlet 和 Sort-Object 来获取 PowerShell 目录中最后修改的文件。

使用获取项目 Cmdlet:

Get-Item (Get-ChildItem -Path C:\Test1 |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1).FullName

输出 :

Directory: C:\Test1
Mode                 LastWriteTime         Length       Name
----                 -------------         ------       ----
-a----         4/20/2023  11:30 PM            315       File1.txt

与前面的代码块一样,上面的代码片段使用 Get-Item cmdlet。 Get-ChildItem 的输出按 LastWriteTime 属性按降序排序,将最近更新的文件放在列表的顶部。与最后一个代码一样,Select-Object cmdlet 检索最近更新的文件。 .FullName 是所选项目的一个属性,用于检索项目的名称。最后,Get-Item 命令使用先前管道返回的完整路径检索项目,并返回有关该项目的信息,例如 NameLength模式LastWriteTime 等。

使用 .Net 框架

使用.Net框架类获取PowerShell目录中最后修改的文件。

使用.Net框架:

$folder = "C:\Test1"
$directory = New-Object System.IO.DirectoryInfo($folder)
$file = $directory.GetFiles() | Sort-Object LastWriteTime -Descending | Select-Object -First 1
$file.FullName

输出 :

C:\Test1\File1.txt

首先,我们使用 New-Object cmdlet 创建一个新的 DirectoryInfo 对象并将其分配给 $directory 变量。然后,我们使用GetFiles()方法获取目录中的所有文件。最后,GetFiles() 输出通过管道传输到 Sort-Object cmdlet,我们在其中使用 -Descending 参数按降序对文件进行排序按 LastWriteTime 属性排序。

现在,Sort-Object cmdlet 输出通过管道传输到 Select-Object cmdlet,后者使用 -First从排序列表中选择第一个文件> 参数设置为1。最终结果存储在$file变量中。最后,使用 $fileFullName 属性输出所选文件的全名(即路径和文件名)。

使用 FileSystemWatcher 类

要获取 PowerShell 目录中最后修改的文件,请使用 FileSystemWatcher 类:

  • 使用 New-Object 创建一个 System.IO.FileSystemWatcher 对象来监视目录中的文件更改。
  • 将观察器的 Path 属性设置为要监视的目录(C:\Test1)。
  • 设置观察者的Filter属性来监视目录中所有文件的更改。
  • 设置观察器的 IncludeSubdirectories 属性以仅监视指定的目录,而不监视子目录。
  • 使观察者能够在指定目录中发生更改时引发事件。
  • 注册观察者对象以监听 Changed 事件并在事件发生时运行脚本块。
  • 输入无限循环以保持脚本运行并等待事件。
  • 使用 Get-ChildItem cmdlet 检索指定目录中最近修改的文件。
  • 按文件的 LastWriteTime 属性按降序对文件列表进行排序。
  • 检查所选文件是否不为空,以及其全名是否与上次修改的文件不同。
  • 如果文件满足步骤12中的条件,则更新最后修改的文件变量并将文件的全名写入控制台。
  • 使用 Start-Sleep 将脚本暂停指定时间(5 秒),并继续监视目录的更改。

使用 FileSystemWatcher 类:

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Test1"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
$lastModifiedFile = $null
$changedAction = {
    $file = Get-ChildItem $watcher.Path -Filter $watcher.Filter -Recurse |
            Sort-Object LastWriteTime -Descending |
            Select-Object -First 1
    if ($file -ne $null -and $file.FullName -ne $lastModifiedFile) {
        $lastModifiedFile = $file.FullName
        Write-Host "Last modified file: $lastModifiedFile"
    }
}
Register-ObjectEvent $watcher "Changed" -Action $changedAction
while ($true) {
    Start-Sleep -Seconds 5
}

输出 :

Id     Name         PSJobTypeName       State     HasMoreData     Location     Command
--     ----         -------------       -----     -----------     --------     -------
1      3c9edcad-7e5 ...                 NotStarted    False                       ...
Last modified file: C:\Test1\File1.txt

该代码创建 System.IO.FileSystemWatcher 类的新实例,并设置其属性以使用 C:\Test1 目录监视任何文件的任何更改>*.* 过滤器。此外,$watcher.IncludeSubdirectories 属性设置为 $false,这意味着观察器将仅监视指定的目录,而不监视其子目录。

EnableRaisingEvents 属性设置为 $true 以使观察者能够在检测到更改时引发事件。然后,该代码将 $lastModifiedFile 变量初始化为 $null 并定义一个 $changedAction 脚本块,该脚本块将在检测到文件更改事件时执行。

$changedAction 脚本块使用 Get-ChildItem cmdlet 检索目录中最近修改的文件,并按 LastWriteTime 属性降序排序。 Select-Object cmdlet 选择排序列表中的第一项。如果找到文件且其 FullName 不等于 $lastModifiedFile 的值,则脚本块将 $lastModifiedFile 变量设置为 FullName 找到的文件,并向控制台写入一条消息,指示最后修改的文件的名称。

最后,Register-ObjectEvent cmdlet 用于将 $changedAction 脚本块注册为当 FileSystemWatcher 检测到更改时要执行的操作。受监控的目录。该脚本进入无限循环并定期休眠 5 秒,从而允许 FileSystemWatcher 继续监视文件更改。

该脚本将无限期地运行,直到通过按 Ctrl+C 手动停止。

考虑到上述解决方案,存在多种使用 PowerShell 获取目录中最后修改的文件的方法。您选择的方法取决于您的个人喜好。

这就是 PowerShell 获取目录中最后修改的文件的全部内容。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯