如何阻止Invoke-Webrequest向$Error写入错误信息?
解决Invoke-WebRequest预期重试错误写入$Error集合的问题
你需要阻止API启动重试时的预期错误被写入$Error集合,避免后续错误判断误判,以下是几种可行的解决方法:
方法1:在Catch块中精准移除当前错误
每次Invoke-WebRequest失败触发catch时,最新的错误会被添加到$Error集合的最前端(索引0),直接在catch中移除这条错误即可:
修改后的作业脚本块示例:
$job = Start-Job -ScriptBlock { $notPosted = $true while ($notPosted) { try { # 加上-ErrorAction Stop确保所有请求失败都触发catch $postId = Invoke-WebRequest -Uri $url -Method Post -Body $body -UseBasicParsing -ErrorAction Stop $notPosted = $false } catch { # 移除本次重试产生的错误,不写入$Error集合 $Error.RemoveAt(0) Start-Sleep -Seconds 1 } } # 仅当存在非预期错误时返回true return $Error.Count -gt 0 }
方法2:临时修改错误偏好设置
在脚本块内临时将错误处理偏好改为SilentlyContinue,让Invoke-WebRequest的错误不写入$Error,同时通过$?判断请求是否成功:
$job = Start-Job -ScriptBlock { # 保存原错误偏好,后续恢复 $originalErrorPref = $ErrorActionPreference $ErrorActionPreference = 'SilentlyContinue' $notPosted = $true while ($notPosted) { $postId = Invoke-WebRequest -Uri $url -Method Post -Body $body -UseBasicParsing if ($?) { # 请求成功,退出循环 $notPosted = $false } else { Start-Sleep -Seconds 1 } } # 恢复原错误处理偏好 $ErrorActionPreference = $originalErrorPref return $Error.Count -gt 0 }
方法3:循环结束后清空$Error(不推荐)
如果能确保循环内的错误都是预期的,且脚本块中没有其他非预期错误,可以在循环结束后直接清空$Error集合,但这种方式会清除所有错误,风险较高:
$job = Start-Job -ScriptBlock { $notPosted = $true while ($notPosted) { try { $postId = Invoke-WebRequest -Uri $url -Method Post -Body $body -UseBasicParsing -ErrorAction Stop $notPosted = $false } catch { Start-Sleep -Seconds 1 } } # 清空所有错误,谨慎使用 $Error.Clear() return $Error.Count -gt 0 }
推荐方案
优先选择方法1,既能确保捕获所有请求失败的情况,又精准移除预期内的重试错误,不会干扰其他非预期错误的记录和判断。
内容的提问来源于stack exchange,提问作者Tom Wolf
相关产品推荐
相关产品推荐

