【问题标题】:Can't access data from Invoke-RestMethod from Powershell API无法从 Powershell API 访问来自 Invoke-RestMethod 的数据
【发布时间】:2021-03-26 01:56:11
【问题描述】:

我已经在这里尝试了所有我能想到的东西,而且我是 powershell 新手,并且一无所获。希望有人可以提供帮助。

我有一个 powershell 调用:

$appSettings = Invoke-RestMethod -Uri $url -Method Get -Headers $header

如果我将 $appSettings 登录到 powerhsell IDE,我会得到:

PS H:\> $appSettings
{
  "DetailedErrors": true,
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

但是,我无法访问这些属性中的任何一个。

PS H:\> $appSettings.DetailedErrors

什么都不返回...

PS H:\> ConvertTo-Json -InputObject $appSettings
"{\n  \"DetailedErrors\": true,\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Trace\",\n   


PS H:\> $appSettings.'Logging'

PS H:\> $appSettings | Select -Property Logging

Logging
-------

那么我如何获得 Logging.LogLevel.Default(意思是我想知道它说的是“Trace”)??

更新完整的错误日志

PS H:\> $AppSettinsJson = $appsettings | ConvertFrom-Json
ConvertFrom-Json : Invalid object passed in, ':' or '}' expected. (362): {
  "DetailedErrors": true,
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "connectionStrings": {
    "Default": "Something"
  },
  "LockingTimeout": "60", //in seconds,
  "Major": "1",
  "Minor" :  "0",
  "buildDate": "#{buildDate}#",
}
At line:1 char:34
+ $AppSettinsJson = $appsettings | ConvertFrom-Json
+                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

【问题讨论】:

    标签: powershell powershell-2.0 powershell-3.0


    【解决方案1】:

    这是因为您尝试访问它的方式。

    $appsettings 不是您想要使用的。它是返回的 JSON 字符串 $appsettings。

    所以,这个……

    $JsonData = @'
    {
      "DetailedErrors": true,
      "Logging": {
        "LogLevel": {
          "Default": "Trace",
          "Microsoft": "Warning",
          "Microsoft.Hosting.Lifetime": "Information"
        }
      }
    }
    '@ | ConvertFrom-Json
    
    $JsonData.DetailedErrors
    # Results
    <#
    True
    #>
    
    
    $JsonData.Logging
    # Results
    <#
    LogLevel                                                                   
    --------                                                                   
    @{Default=Trace; Microsoft=Warning; Microsoft.Hosting.Lifetime=Information}
    #>
    
    $JsonData.Logging.LogLevel
    # Results
    <#
    Default Microsoft Microsoft.Hosting.Lifetime
    ------- --------- --------------------------
    Trace   Warning   Information  
    #>
    

    所以,如果我重构你所做的。我会这样做:

    $appSettings = (Invoke-RestMethod -Uri $url -Method Get -Headers $header) | ConvertFrom-Json
    
    $appSettings.DetailedErrors
    # Results
    <#
    True
    #>
    
    
    $appSettings.Logging
    # Results
    <#
    LogLevel                                                                   
    --------                                                                   
    @{Default=Trace; Microsoft=Warning; Microsoft.Hosting.Lifetime=Information}
    #>
    
    $appSettings.Logging.LogLevel
    # Results
    <#
    Default Microsoft Microsoft.Hosting.Lifetime
    ------- --------- --------------------------
    Trace   Warning   Information  
    #>
    

    根据您使用的 PS 版本的回复更新

    *Json cmdlet 仅适用于 PSv5 及更高版本。

    # Results
    ModuleType Name                         CmdletName_FinctionName             PowerShellVersion
    ---------- ----                         -----------------------             -----------------
    Manifest   Microsoft.PowerShell.Utility ConvertTo-Json                      5.1              
    Manifest   Microsoft.PowerShell.Utility ConvertFrom-Json                    5.1 
    #>
    

    因此你的错误。

    如果你被 PSv2 卡住了,那么你可以用这种方式解析 JSON。

    # Another approach in Windows 8 and higher
    $jsonObjectClass = [Windows.Data.Json.JsonObject,Windows.Data.Json,ContentType=WindowsRuntime]
    ($jsonObject     = $jsonObjectClass::Parse('{"data":["powershell","rocks"]}'))
    
    $jsonObjectClass = [Windows.Data.Json.JsonObject,Windows.Data.Json,ContentType=WindowsRuntime]
    ($jsonObject     = $jsonObjectClass::Parse($JsonData))
    

    更新 - 您也可以将字符串保存到文件中,然后对字符串进行硬解析。

    Clear-Host
    ((Get-Content -LiteralPath 'D:\Temp\appsettings.txt' | 
    Select-String 'Default' -Context 0) -replace '\s+|\"|,' -split(':'))[1]
    # Results
    <#
    Trace
    #>
    

    【讨论】:

    • $appSettings = (Invoke-RestMethod -Uri $url -Method Get -Headers $header) | ConvertFrom-Json 会抛出一个在 ':' 或 '}' 中传递的无效对象......
    • OK,然后分成两步。进行正常呼叫以填充 $appsettings,然后执行第二行。说$AppSettinsJson = $appsettings | ConvertFromJson
    • 这是 devops build yml 中的 powershell 2。我正在使用docs.microsoft.com/en-us/rest/api/azure/devops/git/items/… 并获取 appsettings.json,我可以看出它是以字符串形式返回的。
    • 哇,PSv2,真的吗?该版本不再受支持,应该按照 MS 的建议禁用。 Json cmdlet 在 PSv2 中不存在。
    • 那将是我的最后一次了。无效的 JSON。
    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多