我如何在目录中的文本文件中搜索多个字符串模式
How can i search for multiple string patterns in text files within a directory
我有一个接受输入并搜索驱动器的文本框。
例如驱动器是 C:/users/me
假设我有多个文件和子目录,我想搜索文件中是否存在以下字符串:“ssn”和“DOB”
一旦用户输入了两个字符串。我拆分了字符串但是 space,所以我可以遍历数组。但这是我当前的代码,但我不知道如何继续。
gci "C:\Users\me" -Recurse | where { ($_ | Select-String -pattern ('SSN') -SimpleMatch) -or ($_ | Select-String -pattern ('DOB') -SimpleMatch ) } | ft CreationTime, Name -Wrap -GroupBy Directory | Out-String
如果我手动将上面的代码粘贴到 powershell 中,它就可以工作,但我试图在脚本中重新创建它,但对如何操作感到困惑。
下面的这段代码没有获得所有需要的文件。
foreach ($x in $StringArrayInputs) {
if($x -eq $lastItem){
$whereClause = ($_ | Select-String -Pattern $x)
}else{
$whereClause = ($_ | Select-String -Pattern $x) + '-or'
}
$files= gci $dv -Recurse | Where { $_ | Select-String -Pattern $x -SimpleMatch} | ft CreationTime, Name -Wrap -GroupBy Directory | Out-String
}
我只是按照您的示例并将两者与正则表达式结合起来。我转义了正则表达式以避免意外使用表达式(例如任何字符的点)。
它正在使用我的测试文件,但可能与您的文件不同。您可能需要使用适当的编码添加“-Encoding UTF8”,以便您也可以获得区域特定的字符。
$String = Read-Host "Enter multiple strings seperated by space to search for"
$escapedRegex = ([Regex]::Escape($String)) -replace "\ ","|"
Get-ChildItem -Recurse -Attributes !Directory | Where-Object {
$_ | Get-Content | Select-String -Pattern $escapedRegex
} | Format-Table CreationTime, Name -Wrap -GroupBy Directory | Out-String
Select-String
的 -Pattern
参数接受 array 字符串(其中任何一个都会触发匹配),因此直接传递到 single Select-String
调用应该做的:
$files= Get-ChildItem -File -Recurse $dv |
Select-String -List -SimpleMatch -Pattern $StringArrayInputs } |
Get-Item |
Format-Table CreationTime, Name -Wrap -GroupBy Directory |
Out-String
注:
将 -File
与 Get-ChildItem
一起使用使其 return 仅 文件 ,而不是目录。
使用 -List
和 Select-String
是一种优化,可确保每个文件最多 一个 匹配被查找和报告。
将Select-String
的输出传递给Get-Item
会自动将前者输出的.Path
属性绑定到-Path
参数后者。
- 严格来说,绑定到
-Path
会使参数解释为 通配符表达式 ,但是,这通常不是问题 - 除非路径包含[
个字符。
- 如果可能的话,在
Get-Item
之前插入带有 Select-Object @{ Name='LiteralPath'; Expression='Path' }
的管道段,以确保绑定到 -LiteralPath
。
我有一个接受输入并搜索驱动器的文本框。
例如驱动器是 C:/users/me
假设我有多个文件和子目录,我想搜索文件中是否存在以下字符串:“ssn”和“DOB”
一旦用户输入了两个字符串。我拆分了字符串但是 space,所以我可以遍历数组。但这是我当前的代码,但我不知道如何继续。
gci "C:\Users\me" -Recurse | where { ($_ | Select-String -pattern ('SSN') -SimpleMatch) -or ($_ | Select-String -pattern ('DOB') -SimpleMatch ) } | ft CreationTime, Name -Wrap -GroupBy Directory | Out-String
如果我手动将上面的代码粘贴到 powershell 中,它就可以工作,但我试图在脚本中重新创建它,但对如何操作感到困惑。
下面的这段代码没有获得所有需要的文件。
foreach ($x in $StringArrayInputs) {
if($x -eq $lastItem){
$whereClause = ($_ | Select-String -Pattern $x)
}else{
$whereClause = ($_ | Select-String -Pattern $x) + '-or'
}
$files= gci $dv -Recurse | Where { $_ | Select-String -Pattern $x -SimpleMatch} | ft CreationTime, Name -Wrap -GroupBy Directory | Out-String
}
我只是按照您的示例并将两者与正则表达式结合起来。我转义了正则表达式以避免意外使用表达式(例如任何字符的点)。
它正在使用我的测试文件,但可能与您的文件不同。您可能需要使用适当的编码添加“-Encoding UTF8”,以便您也可以获得区域特定的字符。
$String = Read-Host "Enter multiple strings seperated by space to search for"
$escapedRegex = ([Regex]::Escape($String)) -replace "\ ","|"
Get-ChildItem -Recurse -Attributes !Directory | Where-Object {
$_ | Get-Content | Select-String -Pattern $escapedRegex
} | Format-Table CreationTime, Name -Wrap -GroupBy Directory | Out-String
Select-String
的 -Pattern
参数接受 array 字符串(其中任何一个都会触发匹配),因此直接传递到 single Select-String
调用应该做的:
$files= Get-ChildItem -File -Recurse $dv |
Select-String -List -SimpleMatch -Pattern $StringArrayInputs } |
Get-Item |
Format-Table CreationTime, Name -Wrap -GroupBy Directory |
Out-String
注:
将
-File
与Get-ChildItem
一起使用使其 return 仅 文件 ,而不是目录。使用
-List
和Select-String
是一种优化,可确保每个文件最多 一个 匹配被查找和报告。将
Select-String
的输出传递给Get-Item
会自动将前者输出的.Path
属性绑定到-Path
参数后者。- 严格来说,绑定到
-Path
会使参数解释为 通配符表达式 ,但是,这通常不是问题 - 除非路径包含[
个字符。 - 如果可能的话,在
Get-Item
之前插入带有Select-Object @{ Name='LiteralPath'; Expression='Path' }
的管道段,以确保绑定到-LiteralPath
。
- 严格来说,绑定到