如何排除子文件夹
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
希望这能解决您的问题。
我想从一个文件夹中获取所有“*.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
希望这能解决您的问题。