2015-01-09 91 views
0

我想從一個文件夾中獲取所有「* .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 } 

感謝

回答

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是您想要的結果的唯一兩個文件夾。你仍然排除你不想要的文件,然後返回完整的文件路徑。

+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

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:\一個,子文件夾都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 

我希望這能解決你的問題。

相關問題