You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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),错误原因: $_"
    }
}

这个方法的核心逻辑:

  1. 用Get-ChildItem逐个获取所有要复制的项,避免批量操作时的中断
  2. 对每个项单独执行复制,用try/catch包裹,一旦遇到损坏文件的错误,就捕获并跳过,不影响后续文件的复制
  3. -ErrorAction Stop是关键——它会把Copy-Item默认的非终止错误转换成终止错误,这样才能被catch块捕获到,这也是你之前直接用-ErrorAction参数没效果的原因:默认的非终止错误不会中断批量操作,但也没法触发我们需要的跳过逻辑,这个参数能让错误进入我们的可控处理流程。

备注:内容来源于stack exchange,提问作者Dr_Xunil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:14:37