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

[玩转系统] 周五乐趣:获取最近的文件

作者:精品下载站 日期:2024-12-14 07:45:24 浏览:16 分类:玩电脑

周五乐趣:获取最近的文件


正如您可能想象的那样,我整个星期都会处理许多不同的文件。有时很难把一切都搞清楚。我想回到昨天正在写的剧本,但我不记得我叫它什么了。所以我花了几分钟搜索和过滤,直到找到它。那需要太长时间了。那么为什么不创建一个简单的 PowerShell 工具并将其加载到我的个人资料中呢?

首先,我需要一个日期来过滤。我想找到昨天最后修改的所有文件。

$y = (Get-Date).AddDays(-1).Date

如果我只使用 AddDays 方法,我将获得从现在起正好 24 小时的时间,包括时间。但我想要从午夜开始。这就是 Date 属性带给我的。 $y 的值类似于 2015 年 3 月 19 日星期四 12:00:00 AM。现在,获取目录列表并使用该日期进行过滤就很简单了。

dir -file | where {$_.lastwritetime -ge $y} | Sort LastWriteTime

我需要确保对结果进行排序,但要在最后进行,以便 PowerShell 对筛选后的结果进行排序。

[玩转系统] 周五乐趣:获取最近的文件

当然,我不想一直输入这些内容。所以这里有一个函数可以帮我完成这项工作。

#requires -version 3.0

Function Get-RecentFile {

[cmdletbinding()]
Param(
[Parameter(Position=0)]
#make sure path exists and it belongs to the FileSystem provider
[ValidateScript({
if ((Test-Path -path $_) -AND ((Resolve-Path -path $_).Provider.Name -eq "FileSystem")) {
    $True
}
else {
    Throw "Verify path exists and is a FileSystem path."
}
})]
[string]$Path = ".",
[ValidateScript({$_ -ge 0})]
[int]$Days = 1,
[ValidateNotNullorEmpty()]
[DateTime]$Since = (Get-Date).AddDays(-$Days).Date,
[int]$Newest,
[ValidateNotNullorEmpty()]
[string]$Filter = "*"
)

Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"

#get a full path path for verbose messages
$Path = Resolve-Path -Path $Path

Write-Verbose -Message "Getting files [$filter] from $path since $($Since.ToShortDateString())"

#sort last
$files = Dir -path $Path -filter $Filter -File | 
where {$_.LastWriteTime -ge $Since} | 
Sort LastWriteTime 

if ($Newest) {
    Write-Verbose -message "Getting $newest newest files"
    $files | Select-Object -last $Newest
} 
else {
    $files
}
 Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
 
} #end function

#define an optional alias
Set-Alias -Name grf -Value Get-RecentFile

我设置默认为查找当前文件夹中自昨天以来最后修改的所有文件。我还添加了一个选项,将结果限制为最新的 X 个文件。我的脚本文件夹包含 10 年的文件,因此这非常有帮助。

grf -Days 30 -filter *.txt -Newest 3

我什至创建了一个别名。

[玩转系统] 周五乐趣:获取最近的文件

顺便说一句,如果您将 Days 参数设置为 0,您将在今天修改文件。它还可以很容易地看到我一直在做什么。

get-recentfile -days 30 | group extension

[玩转系统] 周五乐趣:获取最近的文件

我想指出您可能会发现在脚本中有用的另一项功能。您会注意到我经常使用参数验证。如果验证测试失败,PowerShell 将引发异常。但有时您可能想要更优雅的东西。在此函数中,我想验证该路径是否存在并且是文件系统路径。像 HKLM: 这样的路径将测试为 True,但对于函数的目的来说是无效的。

这是验证属性:

[ValidateScript({
if ((Test-Path -path $_) -AND ((Resolve-Path -path $_).Provider.Name -eq "FileSystem")) {
$True
}
else {
Throw "Verify path exists and is a FileSystem path."
}
})]

当您使用 ValidateScript 时,脚本块必须返回 $True 或 $False。如果它是 $False 那么你会得到典型的异常。在这种情况下,如果路径通过了我的测试,我可以告诉 PowerShell 它没问题 ($True) 并且函数继续进行。但如果路径未通过我的测试,我将编写自己的错误消息。

[玩转系统] 周五乐趣:获取最近的文件

正如 PowerShell 中的常见情况,您必须考虑谁将使用您的工具或脚本以及他们将如何响应错误。

我唯一没有做的就是包含任何基于评论的帮助,所以我将把它留给你。享受!

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

取消回复欢迎 发表评论:

关灯