如何排除子文件夹
问题描述:
我想从一个文件夹中获取所有“* .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
是您想要的结果的唯一两个文件夹。你仍然排除你不想要的文件,然后返回完整的文件路径。
答
我将采取以下例如来解释我是如何做到这一点:
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
我希望这能解决你的问题。
由于事实上你必须得到一切,然后排除,如果它只有2个子文件夹,他想要得到根文件夹可能会更快,然后得到他想要递归的2个子文件夹。这样他没有得到第三个文件夹的内容,然后排除它。对于像这样的小套件,有时候最后一点额外的工作是值得的。 – TheMadTechnician 2015-01-09 21:01:12
@TheMadTechnician根据您的评论提供了一条建议。假设我明白..... – Matt 2015-01-09 21:08:55
是的,看起来是正确的。可能希望在路径中包含“D:\ Depot \ Main”。 – TheMadTechnician 2015-01-09 21:46:55