Powershell 搜索文件中的文本

Powershell search for text in files

我有问题。我要在计算机上的文件中搜索文件中的关键字。关键字例如是“C:\Project”。 运行 下面这个脚本时出现错误。但是当我在搜索字符串中删除 C:\ 时,它正在工作。但我有兴趣在开始时使用 C:\ 进行搜索。有人可以帮我更正脚本吗?

$path = 'D:\Cross'
$searchword = 'C:\Project'
$Filename = '*.config'

Get-ChildItem $path -Include "$Filename" -Recurse | ForEach-Object { 
  If (Get-Content $_.FullName | Select-String -Pattern $searchword ){
    $PathArray += $_.FullName
  }
}

Write-Host "Contents of ArrayPath:"
$PathArray | ForEach-Object {$_}

Select-String 默认为 正则表达式 ,因此如果您想要简单的子字符串搜索,请使用 -SimpleMatch 开关:

Get-Content $_.FullName | Select-String -Pattern $searchword -SimpleMatch

或者确保转义任何正则表达式元字符:

Get-Content $_.FullName | Select-String -Pattern $([regex]::Escape($searchword))

您还可以通过使用 Where-Object 并将文件对象直接传送到 Select-String 而不是手动调用 Get-Content:

来显着简化代码
$filesWithKeyword = Get-ChildItem $path -Include "$Filename" -Recurse |Where-Object { $_ |Select-String -Pattern $searchword -SimpleMatch |Select-Object -First 1 }

$filesWithKeyword 现在包含所有 FileInfo 个对象,Select-String 在磁盘上的相应文件中找到至少 1 次关键字出现。 Select-Object -First 1 确保管道在第一次出现时立即中止,抢占读取大文件的需要一直到最后。

整个脚本因此变成:

$path = 'D:\Cross'
$searchword = 'C:\Project'
$Filename = '*.config'

$filesWithKeyword = Get-ChildItem $path -Include "$Filename" -Recurse |Where-Object { $_ |Select-String -Pattern $searchword -SimpleMatch |Select-Object -First 1 }

Write-Host "Contents of ArrayPath:"
$filesWithKeyword.FullName