PowerShell Get-ChildItem -Exclude排除文件夹未生效问题
原写法失效原因
-Exclude参数仅匹配遍历对象的最后一段名称,不支持匹配完整路径,传入C:\Windows这类全路径参数完全无法触发匹配。-Exclude不会阻断递归流程:就算匹配到了目标文件夹名,命令依然会进入文件夹内部遍历所有子项,根本做不到“排除整个目录”的效果。$Recycle.Bin是带系统、隐藏属性的特殊目录,不加-Force参数时默认不会被遍历到。
正确实现方法
用Where-Object自定义过滤逻辑是最稳妥的方案,匹配规则可控,还能直接跳过目标目录避免无效递归,比硬凑-Exclude参数靠谱很多。
场景1:仅排除C盘根目录下的三个目标文件夹
如果只需要排除C盘根目录下的$Recycle.Bin、Windows、Program Files,其他子路径下的同名文件夹不受影响,用以下命令:
Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { # 只对C盘根目录下的一级文件夹做名称校验 if ($_.PSIsContainer -and $_.Parent.FullName -eq 'C:\') { return $_.Name -notin @('$Recycle.Bin', 'Windows', 'Program Files') } # 其余所有项正常返回 return $true }
如果只需要遍历目录,给Get-ChildItem加上-Directory参数即可;如果要遍历本机所有盘符,把-Path C:\替换为-Path (Get-PSDrive -PSProvider FileSystem).Root,同时把判断条件里的固定盘符改成匹配对应盘符根目录即可。
场景2:排除所有层级下的三个目标文件夹
如果需要把任意路径下出现的这三个名称的文件夹连带内容全部排除,可以用正则做全路径匹配,写法更简洁:
Get-ChildItem -Path C:\ -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.FullName -notmatch '\\(\$Recycle\.Bin|Windows|Program Files)(\\|$)' }
这个正则会自动识别路径中任意层级的目标文件夹,同时不会误命中Windows.old、Program Files (x86)这类名称相似的项。
命令里加
-ErrorAction SilentlyContinue是为了跳过访问系统受保护目录时抛出的权限报错,不需要的话可以去掉。
内容的提问来源于stack exchange,提问作者mellinka
相关产品推荐
相关产品推荐

