我需要我的 Get-ChildItem 字符串搜索命令打印文件名及其修改日期值,已排序

I need my Get-ChildItem string search command print file names along with their Date Modified values, sorted

我花了很多时间寻找问题的解决方案,但一无所获。我有一个主要包含 .html 文件的文件夹,我经常需要搜索以查找包含特定字符串的文件。我需要只显示文件名(因为文件只会在那个文件夹中)和文件的上次写入时间的搜索结果。该列表需要按上次写入时间排序。此代码非常适合查找正确的文件

Get-ChildItem -Filter *.html -Recurse | Select-String -pattern "keyWord string" | group path | select name

它的问题是它显示了文件的整个路径(不需要),它没有显示最后写入时间,并且没有按照最后写入时间排序。

我也有这个代码

Get-ChildItem -Attributes !Directory *.html | Sort-Object -Descending -Property LastWriteTime | Select-Object Name, LastWriteTime

该代码完全按照我希望的方式打印所有内容,但它打印文件夹中的所有文件名,而不是仅打印我需要查找的包含特定字符串的文件。

如果你不介意它有点多余,你可以Get-ChildItem搜索后的结果:

Get-ChildItem -Filter *.html -Attributes !Directory -Recurse | Select-String -Pattern "keyWord string" | group path | foreach {Get-ChildItem $_.Name } |  Sort-Object -Descending LastWriteTime | Select Name,LastWriteTime

Select-String 之后,您获得了该对象的属性而不是原始属性,因此我们获取该对象的结果并将其传回 Get-ChildItem 命令以检索这些属性相反。

由于您仅使用 Select-String 来确定文本是否存在于任何文件中,因此请将其移动到 Where-Object 过滤器中并使用 -Quiet 参数,以便它 returns 真或假。然后排序并select你想要的属性。

Get-ChildItem -Filter *.html | 
    Where-Object { $_ | Select-String -Pattern 'keyWord string' -Quiet } | 
        Sort-Object LastWriteTime | 
            Select-Object Name, LastWriteTime

对于多个模式,您可以这样做的一种方法是这样

Get-ChildItem -Filter *.html |
    Where-Object {
        ($_ | Select-String -Pattern 'keyWord string' -Quiet) -and
        ($_ | Select-String -Pattern 'keyWord string #2' -Quiet)
    } |
        Sort-Object LastWriteTime |
            Select-Object Name, LastWriteTime

另一种使用 Select-String 和多个模式的方法可能会更快一些

$patterns = 'keyword 1', 'keyword 2', 'keyword 3'
Get-ChildItem -Filter *.html |
    Where-Object {
        ($_ | Select-String -Pattern $patterns | Select-Object -Unique Pattern ).Count -eq $patterns.Count
    } |
        Sort-Object LastWriteTime |
            Select-Object Name, LastWriteTime