我希望以后获得我想要导出(=复制)的多个源文件夹的所有子项的列表。但是,我不想获取bin / obj文件夹及其子内容。
到目前为止我的方法:
Get-ChildItem $RootDirectory -Attributes Directory -Include $includeFilder |
Get-ChildItem -Recurse -exclude 'bin' |% { Write-Host $_.FullName }
然而,它不起作用。问题似乎是-exclude 'bin'
不匹配,因为整个文件夹名称(类似C:\Blubb\bin
)匹配。
如何仅匹配文件夹名称而不匹配-exclude
语句中的整个路径?可能有更好的方法吗?
答案 0 :(得分:1)
使用@ Joey的示例,您可以重新安排一点,以避免搜索bin / obj文件夹:
gci $rootdirectory -Directory -Recurse |
where { $_.FullName -notmatch '\\(bin|obj)(\\|$)' } |
gci -File -inc $includeFilter | select FullName
只需将-Recurse和where-object过滤器移动到第一个GCI,然后将每个返回目录上的GCI移动。
答案 1 :(得分:0)
你可以更明确一点。不是很好,但应该完成工作:
gci $rootdirectory -Directory -inc $includeFilder |
gci -rec |
where { $_.FullName -notmatch '\\(bin|obj)(\\|$)' }
select FullName
你甚至可以放弃第二个Get-ChildItem。
答案 2 :(得分:0)
可重复使用的过滤器命令:
filter Get-Descendents($Filter={1}) { $_ | where $Filter | foreach { $_; if ($_.PSIsContainer) { $_ | Get-ChildItem | Get-Descendents $Filter } } }
示例:
dir C:\code | Get-Descendents { -not $_.PSIsContainer -or $_.Name -notin 'bin', 'obj'}
这不会进入过滤器失败的目录。
它还允许您预定义过滤器并将它们作为参数传递。
示例:
$myDevItemFilter1 = { -not $_.PSIsContainer -or $_.Name -notin 'bin', 'obj'}
$myDevItemFilter2 = { -not $_.PSIsContainer -or $_.Name -notin '.svn', '.git'}
dir C:\code | Get-Descendents $myDevItemFilter1
dir C:\code | Get-Descendents $myDevItemFilter2