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
我有问题。我要在计算机上的文件中搜索文件中的关键字。关键字例如是“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