在Powershell中导出大型嵌套对象以供以后测试/模拟的最佳方法是什么?特别是Http和Web异常

在Powershell中导出大型嵌套对象以供以后测试/模拟的最佳方法是什么?特别是Http和Web异常,powershell,error-handling,export,Powershell,Error Handling,Export,我正在编写一个大量使用API的脚本。我有一个用于调用RestMethod调用的各种错误响应的大型自定义错误处理函数,我希望能够适当地进行单元测试 我通过使用Export-CliXml保存了一些错误,但是实际上我无法将对象重建回其原始形式。在某些时候,当我需要数据时,我只会得到字符串,当我增加Export-Clixml的-Depth参数时,Powershell会花费大量时间来编写一个庞大的.xml文件 例如,我从Invoke RestMethod中得到一个Http响应错误,我检查状态代码,并在某些

我正在编写一个大量使用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]会引发错误