Powershell:使用-notmatch语句排除多个文件夹

时间:2014-10-13 08:53:13

标签: powershell get-childitem

我正在创建一个小脚本,它将列出计算机上的EXE文件。

$computername = get-content env:computername
get-childitem C: -recurse | ? {$_.fullname -notmatch 'C:\\Windows'} | where {$_.extension -eq ".exe"} | format-table fullname | Out-File "\\server\incomming\$computername.txt"

问题是-notmatch不接受更多语句。我可以复制粘贴? {$_.fullname -notmatch 'C:\\Windows'}并用于其他文件夹,如Program Files(x86),Program Files等。但我不想太夸张一个剧本。

有没有办法可以用-notmatch语句排除多个文件夹?

3 个答案:

答案 0 :(得分:5)

您可以使用-and之类的逻辑运算符来表示更复杂的逻辑表达式。

Get-ChildItem C:\ -Recurse | Where-Object { ($_.FullName -notmatch "C:\\Windows") -and ($_.FullName -notmatch "C:\\Program Files") }   

对于许多路径,我会在调用Get-ChildItem之前将它们添加到数组或哈希表中,并使用Where-Object检查数组或哈希表中是否存在管道文件对象路径。最终,您必须在某处列出路径,但不一定在单个命令中。例如:

$excludedPaths = @("C:\Windows", "C:\Program Files");
Get-ChildItem C:\ -Recurse | Where-Object { $excludedPaths -notcontains $_.Directory }

答案 1 :(得分:1)

感谢您的回答!

是否有可能获得比现在更长的输出?

现在它就像是100个符号,如果路径长于此符号则以点结束。 我得到这样的东西 - C:\ my files \ my programs \ prog ...

答案 2 :(得分:0)

我会用这样的东西:

get-childitem -literalpath e:\*.exe -Recurse | where { $_.DirectoryName -notmatch "Windows" -and $_.DirectoryName -notmatch "MyOtherFiles"}