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

标签 powershell error-handling export

我正在编写大量使用API​​的脚本。对于来自Invoke-RestMethod调用的各种错误响应,我有一个大型的自定义错误处理功能,我希望能够对其进行适当的单元测试。
我通过使用Export-CliXml保存了其中一些错误,但是实际上我无法将对象重建回其原始形式。在某些时候,当我期望数据时,我只会得到字符串,而当我为Export-Clixml增加-Depth参数时,Powershell会花费大量时间来编写一个巨大的.xml文件。
例如,我从Invoke-RestMethod收到一个Http响应错误,我检查了状态代码并将其用于某些情况下的一些自定义错误处理。这是用$ErrorRecord.Exception.Response.StatusCode.Value__抓取的。但是,当我尝试重建CliXml对象时,嵌套在“Response”对象中的所有内容都变成了一个字符串,而且我无法以相同的方式对其进行解析。
所以我的问题是:

  • 是否有导出不花费大量时间来导出和导入的复杂,嵌套,错误记录对象的好方法?
  • powershell如何在几毫秒内获得响应并创建此错误记录,但是导出和导入具有嵌套属性的同一对象要花费大量时间?

  • Public testing API只会返回401未经授权的错误:
    try {
        $global:response = Invoke-RestMethod -Uri "https://reqres.in/api/login" -Method 'POST'
    }
    catch {
        $global:err = $_
    }
    

    最佳答案

    ConvertTo-Json是捕获异常及其嵌套属性的快速方法。指定-Depth可以在对象树中导航超过默认的2层:

    $global:err = $_ | ConvertTo-Json -Depth 3
    
    然后,您可以使用ConvertFrom-Json将其反序列化回一个对象并访问属性:
    ($Global:err | ConvertFrom-Json).ErrorDetails
    
    如果包含运行缓慢的代码,将更容易发现问题,但是我希望您可能会遇到文件系统访问而不是代码问题。您可以使用Measure-Command隔离运行缓慢的代码的问题。
    编辑:看起来您在ExportCli-Xml的正确轨道上-内置的JSON序列化程序可能不像CliXml那样代表对象。我错过了需要反序列化回Error对象的要求。
    您可以尝试跳过Export并仅使用Management.Automation.PSSerializer。这段代码没有引发任何错误,并且很快:
    $DeserializedError = [Management.Automation.PSSerializer]::DeSerialize([Management.Automation.PSSerializer]::Serialize($Error[0]))
    

    关于powershell - 在Powershell中导出大型嵌套对象以便以后进行测试/模拟的最佳方法是什么?特别是Http和Web异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62560000/

    相关文章:

    html - 通过 powershell 检查网页中的某些文本

    powershell - 将 invoke 命令的输出封装在一个变量中 - PowerShell

    PowerShell 命令版本

    swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

    r - 不确定是什么导致R中的此错误(pmvt-软件包: mvtnorm)?

    regex - Windows 相当于 grep -B(上下文之前)和 -A(上下文之后)?

    PHP 电子邮件确认功能 MySQL 数据库错误

    r - 从 R 中的 `label attribute` 到 SPSS 中的 `VARIABLE LABELS` 的信息

    node.js - 如何导出描述/测试并在 Jest 另一个测试文件中重用它们

    r - 导出 R 对象以进行 3D 打印