【问题标题】:Do-untill loop getting error (powershell)直到循环出错(powershell)
【发布时间】:2021-03-13 20:46:04
【问题描述】:

尝试从 JSON 转换 Web 请求,但总是得到以下错误:

Method invocation failed because [Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject] does not contain a method named 'op_Addition'.
At C:\Users\gmicskei\Desktop\lastlogin_users_azureAD.ps1:39 char:17
+                 $QueryResults += $Results
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

这是我的代码:

do {
            $Results = Invoke-WebRequest -Headers $authHeader1 -Uri $Uri -UseBasicParsing -Method "get" -ContentType "application/json"

        if ($Results.value) {
            $QueryResults += $Results.value
        } else {
            $QueryResults += $Results
        }

        $uri = $Results.'@odata.nextlink'
    } until (!($uri)) 

    $QueryResultsjson = $QueryResults | ConvertFrom-Json

你能建议吗?

谢谢, 嘉柏

【问题讨论】:

  • 该错误意味着$QueryResults 中的任何内容都没有“添加内容”方法。触发错误时,您需要找到该 $Var 中的内容。

标签: json powershell invoke-webrequest invoke-restmethod


【解决方案1】:

Invoke-WebRequest -UseBasicParsing 返回的对象是Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject 类型:

  • 此类型没有.Value 属性。

  • 按原样使用它,因此您的代码就是这样做的,这是问题的根源:

    • 第一个循环迭代中,$QueryResults += $Results 按原样存储$Results 变量。
    • 后续循环迭代中,+= 尝试“添加”到一个实例,但没有为此类型定义此类操作。

顺便说一句:为了将$Results 值收集到一个数组 中,$QueryResults 在进入循环之前必须初始化为一个数组,但请注意,由于效率低下,应避免使用 += 迭代构建数组 - 请参阅 this answer


您可以改用Invoke-RestMethod 来解决所有问题,它会自动将JSON 响应解析为对象[pscustomobject] 实例):

$results = do {

  # Calls the web service and automatically parse its JSON output
  # into an object ([pscustomobject] instance).
  $result = Invoke-RestMethod -Headers $authHeader1 -Uri $Uri -Method "get" -ContentType "application/json"

  # Output the result at hand, to be collected across all
  # iterations in the $results variable being assigned to.
  # (.value is assumed to be a top-level property in the JSON data received).
  $result.value 
 
  # Determine the next URI, if any.
  # Since $result is now an *object*, property access should work.
  $uri = $result.'@odata.nextlink'

} while ($uri)

【讨论】:

  • 这几乎是我需要的,$result.value | ConvertTo-Json 是我获取数据的方式。谢啦。 :)
  • 很高兴听到它有帮助,@G.Micskei。请注意,如果您从循环中输出$result.value(我已经更新了答案),$results 将直接收集所有感兴趣的对象 - 我假设您想使用 objects而不是原始的 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2018-03-13
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2022-06-30
相关资源
最近更新 更多