PowerShell对比两个文件夹时如何跳过末尾带句点的损坏文件夹
问题场景
你使用如下PowerShell命令对比两个目录的递归内容时,遇到名称末尾带句点的损坏文件夹会触发报错,导致对比流程中断:
Compare-Object (Get-ChildItem -Recurse Y:\Ftp\BFold\Final) (Get-ChildItem -Recurse Y:\Dest\TFold\Temp)
注:Compare是Compare-Object的默认别名,两类报错的解决方法如下:
方案1:主动跳过所有名称末尾带句点的文件夹
在Get-ChildItem阶段就过滤排除目标异常文件夹,从根源避免报错:
# 封装递归获取有效项的函数,排除末尾带句点的文件夹 function Get-ValidChildItem { param($Path) Get-ChildItem -Path $Path | ForEach-Object { # 跳过名称末尾为句点的文件夹 if ($_.PSIsContainer -and $_.Name.EndsWith('.')) { return } $_ # 递归遍历子目录(排除了异常文件夹后不会触发报错) if ($_.PSIsContainer) { Get-ValidChildItem -Path $_.FullName } } } # 调用函数获取两边的有效项后对比 Compare-Object (Get-ValidChildItem Y:\Ftp\BFold\Final) (Get-ValidChildItem Y:\Dest\TFold\Temp)
方案2:仅忽略遍历错误,不做主动过滤
如果不需要特意排除这类文件夹,只需要让对比流程不中断,可以直接给Get-ChildItem添加静默忽略错误的参数:
Compare-Object (Get-ChildItem -Recurse Y:\Ftp\BFold\Final -ErrorAction SilentlyContinue) (Get-ChildItem -Recurse Y:\Dest\TFold\Temp -ErrorAction SilentlyContinue)
该方案会忽略所有遍历阶段的报错(包括权限不足、路径过长等其他错误),适合只需要对比正常可访问项的场景。
内容的提问来源于stack exchange,提问作者user2916373
相关产品推荐
相关产品推荐

