4

文字列のセット内のすべての文字列を含むフォルダー内のすべてのテキストファイル、つまり基本的にAND演算子をカウントしようとしています。各ファイルの文字列の順序はさまざまで、できればワンライナーを探しています。

つまり、私は次のようなことを達成しようとしています:

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

ただし、上記のステートメントは「str1」または「str2」のいずれかを含むすべてのファイルをカウントするという違いがありますが、ORではなくAND演算を実行しようとしているため、「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

$profileこの種のことをさらに減らすために、以下を自分に追加すると便利だと思います。

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

次に、ソリューション(デフォルトのエイリアスを想定)は次のようになります。

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

参考資料:Power andPith-WindowsPowerShellブログ

于 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 に答える