如何排除子文件夹

时间:2015-01-09 20:47:11

标签: powershell

我想得到所有" * .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 } 

由于

2 个答案:

答案 0 :(得分:0)

-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是您希望获得结果的唯一两个文件夹。您仍然排除您不想要的文件,然后只返回完整的文件路径。

答案 1 :(得分:0)

我将采用以下示例来解释我是如何做到的:

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 子文件夹下的任何文件。 为实现这一点,我将引入(也用作"?")条件,如下所示

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

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