如何使用PowerShell复制文件并跳过损坏或无法读取的文件
如何使用PowerShell复制文件并跳过损坏或无法读取的文件
我完全懂你的烦恼——用cp(也就是Copy-Item)批量复制时,遇到损坏文件就直接卡壳,没法像手动拖拽那样选个“跳过”就继续复制剩下的文件,而且你试过-ErrorAction参数也没效果,确实挺闹心的。
先理下你的场景:
你用这条命令执行复制:
cp * '\\mycomp.local\Location\' -Recurse
当前目录一共14个文件,但因为第6个文件损坏,最终只成功复制了5个,还会弹出类似“无法读取源文件或磁盘”的错误;但手动拖放时系统会弹出提示让你选择“跳过”,就能顺利完成剩余文件的复制,你想要PowerShell也实现这个逻辑。
那咱们换个思路,不用直接批量递归复制,而是逐个遍历文件,用try/catch捕获错误来跳过损坏文件,具体脚本如下:
# 遍历当前目录及子目录的所有文件和文件夹 Get-ChildItem -Recurse | ForEach-Object { try { # 尝试复制当前项,-ErrorAction Stop确保所有错误都会触发catch逻辑 Copy-Item $_.FullName -Destination '\\mycomp.local\Location\' -Force -ErrorAction Stop Write-Host "✅ 成功复制: $($_.FullName)" } catch { # 捕获错误后输出警告,直接跳过当前损坏文件,继续处理下一个 Write-Warning "⚠️ 跳过损坏文件: $($_.FullName),错误原因: $_" } }
如果你的需求只是复制文件,不需要保留子文件夹结构,可以给Get-ChildItem加个-File参数,只遍历文件:
Get-ChildItem -File -Recurse | ForEach-Object { try { Copy-Item $_.FullName -Destination '\\mycomp.local\Location\' -Force -ErrorAction Stop Write-Host "✅ 成功复制: $($_.FullName)" } catch { Write-Warning "⚠️ 跳过损坏文件: $($_.FullName),错误原因: $_" } }
这个方法的核心逻辑:
- 用
Get-ChildItem逐个获取所有要复制的项,避免批量操作时的中断 - 对每个项单独执行复制,用
try/catch包裹,一旦遇到损坏文件的错误,就捕获并跳过,不影响后续文件的复制 -ErrorAction Stop是关键——它会把Copy-Item默认的非终止错误转换成终止错误,这样才能被catch块捕获到,这也是你之前直接用-ErrorAction参数没效果的原因:默认的非终止错误不会中断批量操作,但也没法触发我们需要的跳过逻辑,这个参数能让错误进入我们的可控处理流程。
备注:内容来源于stack exchange,提问作者Dr_Xunil
相关产品推荐
相关产品推荐

