2015-01-09 2 views
0

Я хочу получить все файлы «* .exe» из одной папки. Он имеет 3 подпапки. но я хочу получить файлы только из 2 подпапок. Я пытаюсь использовать -Exclude в PowerShell. Он работает, чтобы исключить один файл, но он не работает, чтобы исключить папку. может кто-нибудь сказать, как его решить.Как исключить подпапки

Это то, что я использую приведенный ниже код, он работает, чтобы исключить файлы «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

+0

@ TheMadTechnician Включено предложение, основанное на вашем комментарии. Предполагая, что я понял ..... – Matt

+0

Да, выглядит правильно. Возможно, вы захотите включить «D: \ Depot \ Main» в пути. – TheMadTechnician

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: \ в, вложенные папки являются Ь, с и d

сейчас Я хочу файлы * .txt от b и c, которые будут перечислены, и я хочу исключить любой файл под 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 

Я надеюсь, что это решит вашу проблему.

Смежные вопросы