Как исключить файлы по части пути к каталогу - PullRequest
0 голосов
/ 07 июня 2018

Я рекурсивно собираю все файлы из папки.

Я хочу исключить некоторые каталоги.

Этот пример работает нормально, но он работает только с расширениями файлов

$excluded = @("*.png", "*.svg", "*.jpg")
$files = Get-ChildItem -Path $pth -Recurse -File -Exclude $excluded

Один из путей может содержать каталог /debug/, который я не хочу включать.Однако следующее не имеет никакого эффекта

$excluded = @("*\bin\*", "*\obj\*")
$files = Get-ChildItem -Path $pth -Recurse -File -Exclude $excluded

Я все еще получаю результаты, такие как c:\myProj\folder\bin\

Затем я попытался (показывая полный код)

$excluded = @("*.png", "*.svg", "*.jpg", "*.csproj", "*.sln","*.config","*.dep", "*.gif", "*.license", "*.dll", "*.nupkg", "*.exe", "*.application","*.manifest","*.xml","*.pdb", "*.cache")
$excludedPath = @("*\bin\*", "*\obj\*","*\System.Test\*")
$files = Get-ChildItem -Path $pth -Recurse -File -Exclude $excluded | Where-Object {$_.FullName -notlike $excludedPath} 

Та же проблема!

PowerShell 5.1

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Полезный ответ Джеймса С. предлагает элегантное решение, которое использует регулярное выражение , а не подстановочные знаки для соответствия части пути.

Что касается:

Что я делаю не так?

  • -Exclude и -Include только когда-либо работают на последний компонент пути ;то есть файл или каталог имя входного файла под рукой.

  • Оператор -like поддерживает только один шаблон на RHS (однако вы можете использовать массив входных строк на LHS для сравнения с этим одним шаблоном)

    • Byпередавая массив в качестве RHS, PowerShell неявно преобразует его в строку с элементами массива, объединенными с пробелами, что приводит к шаблону, который ничего не соответствует;в частности, результирующий шаблон будет *\bin\* *\obj\* *\System.Test\*

Ответ Джеймса С. на основе регулярных выражений проще, но если вы хотите использовать , кратныйшаблоны подстановки для соответствия путям, самый простой подход - использовать оператор switch с параметром -Wildcard :

$files = Get-ChildItem -Path $pth -Recurse -File -Exclude $excluded |
  Where-Object {
    switch -Wildcard $_.FullName {
      *\bin\*         { return $False }
      *\obj\*         { return $False }
      *\System.Test\* { return $False }
      default         { return $True }
    }
  } 

Напримечание: в этом выпуске GitHub .

предлагается -Include \ -Exclude для дополнительной работы с полными путями .
0 голосов
/ 07 июня 2018

Вы можете исключить папки с соответствием регулярному выражению, поскольку в нем сохраняются все подстановочные знаки, в этом случае | - это совпадение 'или'.

Затем используйте -notmatch, чтобы исключить все, что соответствует исключениям.

FullName включает имя файла, поэтому я использую DirectoryName, чтобы не исключать файлы, которые соответствуют.

$excluded = @("*.txt", "*.csv")
$excludedPath = 'bin|obj|System.Test'

Get-ChildItem -Path $pth -Recurse -File -Exclude $excluded |
  Where-Object {$_.DirectoryName -notmatch $excludedPath} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...