如何排除子文件夹

How to exclude sub folders

我想从一个文件夹中获取所有“*.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 适用于文件名,但它在文件夹 name\path 排除方面没有良好的记录。您应该使用 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 是您希望从中获得结果的仅有的两个文件夹。您仍然排除不需要的文件,然后仅 return 完整文件路径。

我将以下面的例子来解释我是如何做到的:

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:\a下,子文件夹是b,c和d

现在我想列出来自 b 和 c 的 *.txt 文件,并且我想排除 d 子文件夹下的任何文件。 为此,我引入了一个 where(也用作“?”) 条件,如下所示

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

希望这能解决您的问题。