如何从文件夹中选择内容中带有特定单词的文件?

时间:2018-07-12 13:43:15

标签: powershell

我正在尝试过滤内容中包含一月或二月两个字的文件。

$files = Get-ChildItem "C:\Users\Desktop\NewFolder\" -Recurse -Filter "*Support*" 
$count = 0
$p = 'january', 'February'

foreach ($file in $files){
    if((Get-Content $file.FullName) | Select-String -Pattern '^%january%'){
        Write-Host "File found"
        #write-host $file.FullName
        $count++
    }
    else {
        Write-Host "File NOt found"
    }
}

Write-Host $count

目前,即使该文件存在,我仍会收到“找不到文件”

2 个答案:

答案 0 :(得分:1)

您的问题可能只是您的正则表达式字符串,尽管仍然可以整体上进行改进。在正则表达式中,百分号不是通配符,您是否希望月份出现在行的开头?这就是锚点^所代表的。

很可能您的文件在任何行的开头都没有字符串%January%。就像我之前提到的,我认为这不是您想要的。

因此,让我们找到您想要的所有文件,并根据$p中的任何作品的存在来过滤这些文件(就像上面的示例一样)

$p ='january','February'
$regexPattern = ($p | ForEach-Object{[regex]::Escape($_)}) -join "|"
$files = Get-ChildItem -Path "c:\temp\" -filter "*.txt"
$files | Where-Object{Select-String -Path $_.Fullname -Pattern $regexPattern}

这将在行中的任何位置吐出其中包含工作1月或2月的任何文件对象。

$regexPattern最终将是$p中单词的管道分隔字符串。 [regex]::Escape()是避免字符串中使用特殊正则表达式字符的好方法,尤其是在您仅使用示例的情况下。

您当然需要相应地更改-Path和-Filter,以及在情况需要时包括-Recurse。

答案 1 :(得分:0)

我认为

Select-String -Path "C:\Users\Desktop\NewFolder\*Support*" -Pattern January,february

或(如果需要递归路径)

Get-ChildItem -Path "C:\Users\Desktop\NewFolder" -Include *Support* -Recurse | Select-String -Pattern January,february

应该给您想要的东西吗? (如果需要,选择字符串也有一个-CaseSensitive开关)