powershell Windows搜索所有在内容中包含“string1”而在内容中不包含“dislike”的文件名

gijlo24d  于 2023-08-05  发布在  Shell
关注(0)|答案(1)|浏览(113)

下面的windows powershell命令帮助列出所有包含string1的文件[不包括一些文件名]

Get-ChildItem -Path "D:\Jenkins" -File -Recurse | Where-Object { $_.Name -notlike "*log*" -and $_.DirectoryName -notlike "*\\Backup\\*" } | Select-String -Pattern "string1"

字符串
我希望增强此命令,使其显示所有包含string1的文件,但不应包含字符串dislike
你能建议一下吗?

biswetbf

biswetbf1#

Select-String * 不 * 支持 * 组合 * 正匹配和负匹配-您可以使用 * 要么 * 正匹配(默认情况下)* 或 * 负匹配(与-NotMatch)。
最简单的解决方案--假设每个文件都能完整地放入内存(通常对 text 文件来说是安全的)--是使用Get-Content-Raw开关将每个文件读取到内存中 in full,并使用-match,正则表达式匹配运算符及其 * 求反变体 *(-notmatch):

Get-ChildItem -LiteralPath D:\Jenkins -File -Recurse | 
  Where-Object { 
    $_.Name -notlike '*log*' -and 
    $_.DirectoryName -notlike '*\Backup\*' -and
    (
      ($content = $_ | Get-Content -Raw) -match 'string1' -and 
      $content -notmatch 'dislike'
    )
  }

字符串
如果内存不足,[1]合并两个Select-String调用,如下所示:

Get-ChildItem -LiteralPath D:\Jenkins -File -Recurse | 
  Where-Object { 
    $_.Name -notlike '*log*' -and 
    $_.DirectoryName -notlike '*\Backup\*' -and
    (
      ($_ | Select-String -Quiet 'string1') -and 
      -not ($_ | Select-String -Quiet 'dislike')
    )
  }


如果你不介意使用高级的regex,一个 singleSelect-String调用就足够了:

Get-ChildItem -LiteralPath D:\Jenkins -File -Recurse | 
  Where-Object { 
    $_.Name -notlike '*log*' -and 
    $_.DirectoryName -notlike '*\Backup\*' -and
    (
      $_ | Select-String -Quiet '(?s)(?<!dislike.*?)string1(?!.*?dislike)'
    )
  }


有关正则表达式的解释和使用它的选项,请参见this regex101.com page
[1]考虑到 text 文件很少会大到无法放入内存,避免内存不足问题的一个潜在方法是将文件限制为仅搜索文本文件,如果可行的话,* 通过其文件扩展名 *;例如,您可以将-Include *.txt, *.csv, ...添加到Get-ChildItem调用。

相关问题