4

我试图计算一个文件夹中的所有文本文件,该文件夹包含一组字符串中的所有字符串,即基本上是一个 AND 运算符。每个文件中字符串的顺序可能会,最好我正在寻找一个单行。

即我正在尝试完成类似的事情:

(Get-ChildItem -filter "file*" C:\temp |
Select-String -Pattern @(“str1", "str2")).Count

但不同的是,上面的语句计算了所有包含“str1”或“str2”的文件,但我正在尝试执行 AND 操作而不是 OR,因此只计算同时包含“str1”和“str2”的文件.

问候, 奥拉

4

4 回答 4

3

这也许可以通过-AND操作员完成这项工作:

(Get-ChildItem . -include *.txt -recurse |
    % {(Select-String $_ -Pattern "str1") -AND (select-string $_ -pattern "str2")} |
        where {$_ -eq $true}).count
于 2012-06-04T08:03:34.280 回答
2

如果输入字符串的数量是固定的,那么利用管道可以非常巧妙地完成:

get-childitem c:\temp\file* |
    select-string -l str1   |
    get-childitem           |
    select-string -l str2   |
    measure-object

如果您只想获取计数,而不是Measure-Object返回的统计信息,请添加| select -exp Count到管道的末尾。

我发现将以下内容添加到 my$profile以进一步减少此类事情很有用。

Set-Alias ss Select-String
${function:...} = { process { $_.($args[0]) } }

然后,解决方案(假设默认别名)变为:

gci c:\temp\file* | ss -l str1 | gci | ss -l str2 | measure | ... Count

参考资料:Power 和 Pith - Windows PowerShell 博客

于 2012-06-04T10:50:13.210 回答
1

据我所知,这不能很好地完成。所以也许是这样的(未经测试):

@(Get-ChildItem |
    Where-Object {
      $failed = $false
      $file = Get-Content $_
      $strings | ForEach-Object {
        if (!($file -match $_)) { $failed = $true }
      }
      !$failed
    }).Count
于 2012-06-04T06:16:14.053 回答
0
@(Get-ChildItem C:\temp -Filter "file*" | 
  where { ($_ | Select-String str1 -Quiet) -and ($_ | Select-String str2 -Quiet)}
).Count
于 2012-06-04T08:51:17.493 回答