在Powershell中导出大型嵌套对象以供以后测试/模拟的最佳方法是什么?特别是Http和Web异常
我正在编写一个大量使用API的脚本。我有一个用于调用RestMethod调用的各种错误响应的大型自定义错误处理函数,我希望能够适当地进行单元测试 我通过使用Export-CliXml保存了一些错误,但是实际上我无法将对象重建回其原始形式。在某些时候,当我需要数据时,我只会得到字符串,当我增加Export-Clixml的-Depth参数时,Powershell会花费大量时间来编写一个庞大的.xml文件 例如,我从Invoke RestMethod中得到一个Http响应错误,我检查状态代码,并在某些场景中使用该代码进行一些自定义错误处理。这是用在Powershell中导出大型嵌套对象以供以后测试/模拟的最佳方法是什么?特别是Http和Web异常,powershell,error-handling,export,Powershell,Error Handling,Export,我正在编写一个大量使用API的脚本。我有一个用于调用RestMethod调用的各种错误响应的大型自定义错误处理函数,我希望能够适当地进行单元测试 我通过使用Export-CliXml保存了一些错误,但是实际上我无法将对象重建回其原始形式。在某些时候,当我需要数据时,我只会得到字符串,当我增加Export-Clixml的-Depth参数时,Powershell会花费大量时间来编写一个庞大的.xml文件 例如,我从Invoke RestMethod中得到一个Http响应错误,我检查状态代码,并在某些
$ErrorRecord.Exception.Response.StatusCode.Value\uuuu>捕获的。但是,当我尝试重新构建CliXml对象时,嵌套的“Response”对象中包含的所有内容都会变成一个字符串,我无法以相同的方式解析它
因此,我的问题是:
有没有一种好方法可以导出一个复杂的、嵌套的、错误记录对象,而不需要花费大量时间来导出和导入
powershell如何获得响应并在毫秒内创建此错误记录,而我导出和导入具有嵌套属性的同一对象却需要花费大量时间
这只会返回一个未经授权的错误:
try {
$global:response = Invoke-RestMethod -Uri "https://reqres.in/api/login" -Method 'POST'
}
catch {
$global:err = $_
}
是捕获异常及其嵌套属性的快速方法。指定-Depth
在对象树中导航超过默认的两个层:
$global:err = $_ | ConvertTo-Json -Depth 3
然后,您可以将其反序列化回对象,并访问以下属性:
($Global:err | ConvertFrom-Json).ErrorDetails
如果您包含运行缓慢的代码,那么隔离它的问题会更容易,但我预计您可能会遇到文件系统访问问题,而不是代码问题。您可以使用来隔离代码运行缓慢的问题
编辑:使用ExportCli Xml
,您似乎走对了方向——内置的JSON序列化程序可能不像CliXml那样表示对象。我错过了需要反序列化回错误对象的要求
您可以尝试跳过导出并使用。此代码没有引发任何错误,并且非常快速:
$DeserializedError = [Management.Automation.PSSerializer]::DeSerialize([Management.Automation.PSSerializer]::Serialize($Error[0]))
这回答了你的问题吗,只需搜索PowerShell serialize
:可能的答案:[System.Management.Automation.PSSerializer]::serialize($object)
。由于某些原因,这也无法完成往返$error.Exception.Response内容仍然只是一个大字符串,我无法获取$error.Exception.Response.StatusCode或$error.Exception.Response.StatusCode.value\序列化错误对象然后反序列化它之后,某些对象无法完全序列化,因为它们具有循环属性。这意味着它的一个属性引用回一个(大)父属性。这就是例如comes from.ConvertTo-Json几乎可以工作的地方,除了它只返回不能转换为errorrecord对象类型的PSCustomObject。正在将对象保存到内存中的某个位置。。。是否有某种方法可以将原始信息导出到文件中,以便使其恢复生命?我没有明确提到,因为它非常慢,但您可能想尝试一下。这似乎是迄今为止最好的答案,但它仍然无法准确地重新创建错误对象。在转换为Json之前:$err.Exception.Response.StatusCode为'Bad Request',$err.Exception.Response.StatusCode.value\uuu为'400'。从Json转换后:$err.Exception.Response.StatusCode为'400',而.StatusCode.value_uuu_uu为null。从Json转换回后,也尝试将其转换回[System.Management.Automation.ErrorRecord]会引发错误