PowerShell脚本Copy-Item报错:Buffer cannot be null问题排查求助
PowerShell脚本Copy-Item报错“Buffer cannot be null”排查方案
报错原因分析
出现“Buffer cannot be null”参数错误,核心原因多为路径解析异常或目标目录未提前创建,结合脚本细节具体指向:
- 路径分隔符混用:脚本中用
$des/$server混合了Windows标准的\和Linux风格的/,导致PowerShell解析路径时出错 - 目标目录不存在:
$final对应的目录未提前创建,Copy-Item的-Recurse参数在路径解析错误时无法自动生成目录 - 远程会话有效性未校验:未确认
New-PSSession是否成功建立,无效会话会导致后续Copy-Item参数异常
修复步骤
1. 用标准方法构建路径
替换手动拼接路径的方式,用Join-Path自动处理分隔符,避免混用问题:
$final = Join-Path -Path $des -ChildPath $server
2. 提前创建目标目录
在执行Copy-Item前,先检查并创建目标目录:
if (-not (Test-Path -Path $final)) { New-Item -Path $final -ItemType Directory -Force | Out-Null }
3. 校验远程会话状态
创建会话后先确认会话是否正常开启,避免无效会话导致报错:
if ($session -and $session.State -eq 'Opened') { # 执行文件拷贝逻辑 } else { Write-Host "无法建立到 $server 的远程会话" continue }
4. 优化Copy-Item参数顺序(可选)
部分PowerShell版本对参数顺序敏感,将-FromSession前置,确保参数识别正确:
Copy-Item -FromSession $session -Path $source -Destination $final -Recurse -Force -Verbose
修复后的完整脚本
$listservers = Get-Content "C:\Users\bob\Documents\PowerShell\serverlist.txt" $cred = Get-Credential $source = "C:\PerfLogs\Admin\*" $des = "C:\Users\bob\Documents\PowerShell\Logs\" foreach($server in $listservers) { if(Test-Connection -ComputerName $server -Quiet) { $session = New-PSSession -ComputerName $server -Credential $cred if ($session -and $session.State -eq 'Opened') { $final = Join-Path -Path $des -ChildPath $server if (-not (Test-Path -Path $final)) { New-Item -Path $final -ItemType Directory -Force | Out-Null } Copy-Item -FromSession $session -Path $source -Destination $final -Recurse -Force -Verbose Remove-PSSession -Session $session # 及时关闭会话释放资源 } else { Write-Host "无法建立到 $server 的远程会话" } } else{ Write-Host "无法连接到 $server" } }
内容的提问来源于stack exchange,提问作者dalat9181
相关产品推荐
相关产品推荐

