PowerShell从CSV复制文件:无法记录失败问题求助
PowerShell文件复制脚本问题排查与修复
问题根源
Copy-Item默认不抛出终止错误
当源文件不存在时,Copy-Item默认仅输出警告级别的非终止错误,不会触发try/catch块,导致这类失败无法被记录到日志。目标路径判断逻辑缺陷
如果CSV中Destination字段是完整文件路径(而非目录路径),Test-Path会判定路径不存在,执行mkdir会创建同名目录,后续复制操作必然失败。
修正后的脚本
Import-Csv -Path c:\scripts\file.csv | ForEach-Object { # 提取目标路径的目录部分,确保目录存在 $targetDir = Split-Path -Path $_.Destination -Parent if (-not (Test-Path -Path $targetDir)) { New-Item -Path $targetDir -ItemType Directory -Force | Out-Null } # 执行文件复制并捕获所有错误 try { Copy-Item -Path $_.Source -Destination $_.Destination -ErrorAction Stop # 可选:记录成功日志 "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 成功复制: $($_.Source) -> $($_.Destination)" | Out-File -Append -FilePath "c:\scripts\success.log" } catch { # 记录失败详情,包含错误信息 "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - 复制失败: $($_.Source) -> $($_.Destination),错误: $($_.Exception.Message)" | Out-File -Append -FilePath "c:\scripts\failed.log" } }
关键修改说明
- 新增
-ErrorAction Stop参数:强制Copy-Item将所有错误转为终止错误,确保try/catch能捕获源文件不存在、权限不足等各类问题 - 用
Split-Path -Parent提取目标目录:无论CSV中Destination是目录还是文件路径,都能正确创建所需的父目录 - 完善日志内容:添加时间戳和错误详情,便于后续排查具体失败原因
- 可选新增成功日志:完整追踪所有复制操作的状态
内容的提问来源于stack exchange,提问作者catran
相关产品推荐
相关产品推荐

