我正在递归地抓取文件夹中的所有文件。
我想排除一些目录。
此示例工作正常,但它只处理文件扩展名
$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
我做错了什么?
答案 0 :(得分:3)
James C.'s helpful answer提供了一个优雅的解决方案,它使用正则表达式匹配而不是通配符来匹配路径部分。
至于:
我做错了什么?
-Exclude
和-Include
仅对 last 路径组件进行操作;即,手头输入文件的文件或目录 name 。
-like
运算符仅支持RHS上的 一个模式(但是,您可以使用数组LHS上的输入字符串与该模式进行比较)
*\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}