如何通过目录路径的一部分排除文件

时间:2018-06-07 15:02:22

标签: powershell

我正在递归地抓取文件夹中的所有文件。

我想排除一些目录。

此示例工作正常,但它只处理文件扩展名

$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 :(得分:3)

James C.'s helpful answer提供了一个优雅的解决方案,它使用正则表达式匹配而不是通配符来匹配路径部分。

至于:

  

我做错了什么?

  • -Exclude-Include last 路径组件进行操作;即,手头输入文件的文件或目录 name

  • -like 运算符仅支持RHS上的 一个模式(但是,您可以使用数组LHS上的输入字符串与该模式进行比较)

    • 通过将数组作为RHS传递,PowerShell将其隐式转换为字符串,其中数组元素与空格连接,从而导致模式不匹配任何事情; 具体而言,生成的模式为*\bin\* *\obj\* *\System.Test\*

James C.的基于正则表达式的答案更简单,但如果你确实想使用多个通配符模式来匹配路径,最简单的方法是使用 {带有switch选项的{1}}语句

-Wildcard

旁注:this GitHub issue中提议加强$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 } } } \ -Include以选择性地对抗完整路径

答案 1 :(得分:2)

您可以排除使用正则表达式匹配的文件夹,因为它会保存所有通配符,在这种情况下|是'或'匹配。

然后使用-notmatch排除与排除项匹配的任何内容。

FullName包含文件名,因此我使用DirectoryName,因此它不会排除匹配的文件。

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

Get-ChildItem -Path $pth -Recurse -File -Exclude $excluded |
  Where-Object {$_.DirectoryName -notmatch $excludedPath}