Win7 Powershell 4 sls模式匹配没有字符串A的行,但是字符串B

时间:2015-05-28 21:37:06

标签: regex powershell

使用Win 7和Powershell 4,我需要列出目录中包含不包含" CIC"的行的所有文件。但确实包含",IA,"。我能够找到包含",IA和#34;的行的文件。使用

"dir -recurse *.* | sls -pattern ",IA," | select -unique filename"

但无法弄清楚如何修改此内容以排除也包含" CIC"

的行

3 个答案:

答案 0 :(得分:0)

您可以使用环视排除它们:

dir -recurse . | sls -pattern "(?<!CIC),IA,(?!=CIC)" | select -unique filename

这表示“如果没有预先设定,IA,,则查找CIC。”

您可以考虑在没有Select-Stringsls)的情况下执行此操作:

dir -recurse . | Where-Object { $_.Name -like "*,IA,*" -and $_.Name -notlike "*CIC*" } | select -unique filename

答案 1 :(得分:0)

使用switch语句可以轻松解决此问题。另外,我认为你的字符串区分大小写

#requires -v 3
dir c:\...\?.txt | %{
        $hasIAwithCommasCaseSensitive,$hasCICcaseSensitive=$false,$false
        switch -w -c -f $_{
            '*,IA,*' {$hasIAwithCommasCaseSensitive=$true}
            '*CIC*' {$hasCICcaseSensitive=$true;break}
        }
        if($hasIAwithCommasCaseSensitive -and -not $hasCICcaseSensitive){$_}
    }

简单。

答案 2 :(得分:0)

我会坚持使用您的Select-String方法,但我会让它搜索这两个字词,并返回所有匹配项。然后按文件对结果进行分组(我将使用Path属性,以防您想要递归执行并具有相同名称的文件)。然后将结果通过Where语句传递,该语句会深入到每个文件的结果组中,并返回到已返回的Select-String的匹配项,并确保&#39; CIC&#39;不包括在内。

Get-ChildItem .\* -file | Select-String -Pattern "CIC|,AI," -AllMatches | Group Path | Where{$_.group.matches.value -notcontains "CIC"} | Select -expand Name

另外,因为我们已将它们分组,所以我们只有唯一的路径。如果您想要唯一的文件(例如在两个位置使用Contacts.txt,但只返回一个值),则必须进行一些额外的处理,例如将它们全部传送到Split-Path -leaf,然后选择唯一值。