我正在尝试计算包含一组字符串中所有字符串的文件夹中的所有文本文件,即基本上是AND运算符。每个文件中字符串的顺序可能是最好的,我最好是寻找单行。
即。我正在努力完成类似的事情:
(Get-ChildItem -filter "file*" C:\temp |
Select-String -Pattern @(“str1", "str2")).Count
但区别在于上述语句计算包含“str1”或“str2”的所有文件,但我正在尝试进行AND操作而不是OR,因此只计算包含“str1”和“STR2”。
问候,奥拉
答案 0 :(得分:3)
这可能可以通过-AND
运算符来完成:
(Get-ChildItem . -include *.txt -recurse |
% {(Select-String $_ -Pattern "str1") -AND (select-string $_ -pattern "str2")} |
where {$_ -eq $true}).count
答案 1 :(得分: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
答案 2 :(得分:1)
据我所知,这不可能是漂亮的。所以也许这样(未经测试):
@(Get-ChildItem |
Where-Object {
$failed = $false
$file = Get-Content $_
$strings | ForEach-Object {
if (!($file -match $_)) { $failed = $true }
}
!$failed
}).Count
答案 3 :(得分:0)
@(Get-ChildItem C:\temp -Filter "file*" |
where { ($_ | Select-String str1 -Quiet) -and ($_ | Select-String str2 -Quiet)}
).Count