使用Win 7和Powershell 4,我需要列出目录中包含不包含" CIC
"的行的所有文件。但确实包含",IA
,"。我能够找到包含",IA
和#34;的行的文件。使用
"dir -recurse *.* | sls -pattern ",IA," | select -unique filename"
但无法弄清楚如何修改此内容以排除也包含" CIC
"
答案 0 :(得分:0)
您可以使用环视排除它们:
dir -recurse . | sls -pattern "(?<!CIC),IA,(?!=CIC)" | select -unique filename
这表示“如果没有预先设定,IA,
,则查找CIC
。”
您可以考虑在没有Select-String
(sls
)的情况下执行此操作:
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
,然后选择唯一值。