如何排除子文件夹

问题描述:

我想从一个文件夹中获取所有“* .exe”文件。它有3个子文件夹。但我只想从2个子文件夹中获取文件。我试图在PowerShell中使用-Exclude。它正在努力排除单个文件,但它无法排除文件夹。任何人都可以告诉如何解决它。如何排除子文件夹

这是我正在使用下面的代码它正在工作排除“HWEMNGR.EXE”等文件,但它不允许我从主文件夹中排除子文件夹。

$Files = Get-ChildItem -Path "D:\depot\main" -Recurse -Include "*.exe" -Exclude HWEMNGR.EXE,wmboot.exe,SDClientMobileEdition.exe | % { $_.FullName } 

感谢

-Exclude是好的但它不具备文件夹名称\路径排除有良好记录的文件名。您应该使用Where-Object子句来解决这个问题。

$Files = Get-ChildItem -Path "D:\depot\main" -Recurse -Include "*.exe" -Exclude "HWEMNGR.EXE","wmboot.exe","SDClientMobileEdition.exe" | 
    Select-Object -ExpandProperty FullName | 
    Where-Object{$_ -notmatch "\\FolderName\\"} 

的片段% { $_.FullName }Select-Object -ExpandProperty FullName它做同样的事情所取代。然后我们使用Where-Object来排除FolderName不存在的路径。这是基于正则表达式,所以我们在斜线上加倍。这也有助于确保我们排除的文件夹,而不是可能被称为“FolderName.exe”

替代方法

TheMadTechnician指出,你可以从另一个方向来到这,只是确保文件的文件来自你真正关心的唯一两个文件夹。 Get-ChildItem将采取一个数组的路径,所以你也可以使用这样的东西。

$paths = "D:\depot\main\install","D:\depot\main\debug" 
$excludes = "HWEMNGR.EXE","wmboot.exe","SDClientMobileEdition.exe" 
$Files = Get-ChildItem $paths -Filter "*.exe" -Exclude $excludes | Select-Object -ExpandProperty FullName 

$paths是您想要的结果的唯一两个文件夹。你仍然排除你不想要的文件,然后返回完整的文件路径。

+0

由于事实上你必须得到一切,然后排除,如果它只有2个子文件夹,他想要得到根文件夹可能会更快,然后得到他想要递归的2个子文件夹。这样他没有得到第三个文件夹的内容,然后排除它。对于像这样的小套件,有时候最后一点额外的工作是值得的。 – TheMadTechnician 2015-01-09 21:01:12

+0

@TheMadTechnician根据您的评论提供了一条建议。假设我明白..... – Matt 2015-01-09 21:08:55

+0

是的,看起来是正确的。可能希望在路径中包含“D:\ Depot \ Main”。 – TheMadTechnician 2015-01-09 21:46:55

我将采取以下例如来解释我是如何做到这一点:

Get-ChildItem C:\a -include "*.txt" -recurse | %{$_.fullname} 

C:\a\b\b1.txt 
C:\a\b\b2.txt 
C:\a\b\b3.txt 
C:\a\c\c1.txt 
C:\a\c\c2.txt 
C:\a\c\c3.txt 
C:\a\d\d1.txt 
C:\a\d\d2.txt 

这里下C:\一个,子文件夹都b,c和d现在

我想从b和c * * .txt文件列出,我想排除d子文件夹下的任何文件。 要做到这一点我介绍一个其中(也用作“?”)条件如下

Get-ChildItem C:\a -include "*.txt" -recurse | ?{$_.fullname -notlike "C:\a\d\*"} | %{$_.fullname} 

C:\a\b\b1.txt 
C:\a\b\b2.txt 
C:\a\b\b3.txt 
C:\a\c\c1.txt 
C:\a\c\c2.txt 
C:\a\c\c3.txt 

我希望这能解决你的问题。