如果这个答案似乎与以前的答案重复,我深表歉意。我只是想展示一个更新的(通过 POSH 5.0 测试)解决这个问题的方法。之前的答案是 3.0 之前的版本,不如现代解决方案高效。
文档对此并不清楚,但Get-ChildItem -Recurse -Exclude
仅匹配叶 ( Split-Path $_.FullName -Leaf
) 上的排除,而不是父路径 ( Split-Path $_.FullName -Parent
)。匹配排除只会删除具有匹配叶子的项目;Get-ChildItem
仍然会递归到那片叶子。
在 POSH 1.0 或 2.0 中
Get-ChildItem -Path $folder -Recurse |
? { $_.PsIsContainer -and $_.FullName -inotmatch 'archive' }
注意:与 @CB相同的答案。
在 POSH 3.0+
Get-ChildItem -Path $folder -Directory -Recurse |
? { $_.FullName -inotmatch 'archive' }
注意: 来自@CB的更新答案。
多重排除
这专门针对目录,同时排除带有参数的叶子,以及带有(不区分大小写的)比较Exclude
的父级:ilike
#Requires -Version 3.0
[string[]]$Paths = @('C:\Temp', 'D:\Temp')
[string[]]$Excludes = @('*archive*', '*Archive*', '*ARCHIVE*', '*archival*')
$files = Get-ChildItem $Paths -Directory -Recurse -Exclude $Excludes | %{
$allowed = $true
foreach ($exclude in $Excludes) {
if ((Split-Path $_.FullName -Parent) -ilike $exclude) {
$allowed = $false
break
}
}
if ($allowed) {
$_
}
}
注意:如果您希望$Excludes
区分大小写,有两个步骤:
- 从 中删除
Exclude
参数Get-ChildItem
。
if
将第一个条件
更改为:
if ($_.FullName -clike $exclude) {
注意:此代码具有我永远不会在生产中实现的冗余。您应该稍微简化一下以适应您的确切需求。它很好地作为一个详细的例子。