PowerShell中Copy-Item无异常却复制失败,如何强制抛出异常?
解决Copy-Item无异常但复制未完成的问题
强制抛出异常的配置方法
1. 全局启用终止错误捕获
在脚本开头设置$ErrorActionPreference = 'Stop',让所有命令默认将非终止错误转为终止错误,配合-ErrorAction Stop确保Copy-Item的所有错误都能触发catch块:
$ErrorActionPreference = 'Stop' Try { Copy-item "$UpdateSourceFolder\*" "$UpdateDestinationFolder" -Force -Recurse -Verbose 4>&1 | Add-Content $LogFilePath Add-Content $LogFilePath "SUCCESSFULLY COPIED FILE" } catch { $errorMessage = "复制错误: $($_.Exception.Message)`n调用栈: $($_.ScriptStackTrace)" Add-Content $LogFilePath $errorMessage }
4>&1将Verbose输出重定向到日志,可查看复制过程中每个文件的处理细节,定位被跳过的文件。
2. 逐个文件复制捕获细粒度错误
用Get-ChildItem遍历所有文件(包括隐藏/系统文件),再逐个执行Copy-Item,单个文件的错误会直接触发catch,精准定位问题文件:
$ErrorActionPreference = 'Stop' Try { Get-ChildItem "$UpdateSourceFolder\*" -Force -Recurse | ForEach-Object { Copy-Item $_.FullName -Destination $UpdateDestinationFolder -Force -ErrorAction Stop } Add-Content $LogFilePath "SUCCESSFULLY COPIED FILE" } catch { $errorMessage = "复制文件 $($_.TargetObject) 失败: $($_.Exception.Message)" Add-Content $LogFilePath $errorMessage }
3. 提前验证共享路径可用性
在复制前先测试共享文件夹的访问权限,排除路径不可达或权限不足的问题:
Try { Test-Path "$UpdateSourceFolder" -ErrorAction Stop Add-Content $LogFilePath "共享文件夹可正常访问" } catch { Add-Content $LogFilePath "无法访问共享文件夹: $($_.Exception.Message)" }
额外排查点
- 检查共享文件夹的NTFS权限:共享权限允许访问不代表NTFS权限允许读取文件,需确保运行脚本的用户对共享内的文件有读取权限。
- 确认目标路径存在:若
$UpdateDestinationFolder不存在,Copy-Item默认会创建,但可提前用New-Item -ItemType Directory -Path $UpdateDestinationFolder -Force确保路径存在。
内容的提问来源于stack exchange,提问作者aSpagno
相关产品推荐
相关产品推荐

