如何使用PowerShell处理远程服务器返回的RemoteException异常提示?
异常产生原因
该提示不属于真实执行错误:reg.exe是Windows原生控制台程序,执行成功时会将成功提示输出到标准错误流(STDERR),而PowerShell远程会话默认会将原生程序输出到STDERR的内容封装为RemoteException抛出,就出现了操作成功但仍收到异常提示的现象。你之前使用try-catch不生效,是因为这类异常默认属于非终止错误,不会触发catch逻辑。
解决方案
以下两种方案均可实现屏蔽多余提示、同时捕获真实执行错误的需求:
方案1:重定向流+判断退出码(推荐,适配现有逻辑)
reg.exe执行成功时退出码为0,执行失败时退出码为非0值,你可以通过重定向错误流、判断退出码的方式区分真实错误,修改后的代码如下:
#PARAMETERS - Variables $Serverlist = Get-Content C:\ServerList.txt try { Foreach ($ServerName in $Serverlist) { $session = New-PSSession -ComputerName $servername -ErrorAction Stop Write-Host -Foregroundcolor Green "Copying ODBC Driver for $servername" $copy_cmd = "C:\MYFILE.reg" Copy-Item $copy_cmd \\$servername\C$\ -recurse -force -ErrorAction Stop; Write-Host -Foregroundcolor Green "ODBC Successfully copied on $servername" Invoke-Command -Session $session -ErrorAction Stop -ScriptBlock { # 重定向reg.exe的错误流到标准输出,避免被识别为异常 reg import C:\CopiedFile.reg 2>&1 # 检查reg命令退出码判断是否真的执行失败 if ($LASTEXITCODE -ne 0) { throw "reg文件导入失败,错误码:$LASTEXITCODE" } Write-Host -Foregroundcolor Green "ODBC was installed" } # 用完会话及时清理 Remove-PSSession $session } } catch { Write-Host "ERROR: $_" -Foregroundcolour Red exit 1 }
修改点说明:
- 给
reg import添加2>&1参数,将标准错误流重定向到标准输出,避免PowerShell将成功信息识别为异常 - 增加对
$LASTEXITCODE的判断,只有当reg命令退出码非0时才抛出真实错误 - 给所有可能出错的命令添加
-ErrorAction Stop参数,将非终止错误转换为可被catch捕获的终止错误 - 补充了原代码遗漏的大括号和会话清理逻辑
方案2:使用PowerShell原生注册表操作
如果需要完全规避原生程序的流问题,可以改用PowerShell自带的Get-ItemProperty、Set-ItemProperty等注册表命令直接操作注册表项,不需要调用reg.exe,也不会出现多余的异常提示,适合需要长期迭代的脚本场景。
内容的提问来源于stack exchange,提问作者ulisses
相关产品推荐
相关产品推荐

