Invoke-RestMethod和foreach循环

时间:2017-12-27 22:01:15

标签: rest powershell

通过PowerShell我试图通过加密货币交换的公共API从所有货币对中获取最后的股票代码数据。 为此我首先进入所有市场,然后我想循环使用这些,但由于某种原因,只返回第一个货币对。

任何人都知道我缺少什么?

$bt_baseapi_url = "https://bittrex.com/api/v1.1/"
$getmarkets = $bt_baseapi_url + "public/getmarkets"
$getticker = $bt_baseapi_url + "public/getticker"

$markets = Invoke-RestMethod -Uri $getmarkets
$marketnames = $markets.result

foreach ($marketname in $marketnames.marketname) {
    $tickerurl = $getticker + "?market=" + $marketname
    $ticker = Invoke-RestMethod -Uri $tickerurl
    return $ticker.result.last
}

1 个答案:

答案 0 :(得分:1)

正如Ansgar Wiechers在对该问题的评论中建议的那样,不要在return 声明的正文中使用foreach在继续循环的同时返回(输出)一个值; return将从任何封闭的函数脚本返回。

相反,依赖于PowerShell的隐式输出行为,如以下简单示例所示:

> foreach ($el in 1, 2, 3) { $el }
1
2
3

简单地引用$el而不分配变量或管道/将其重定向到其他地方会导致其值为输出

如果需要,使用continue来阻止在循环体中执行后续语句,同时继续整个循环;使用break 退出循环。

相比之下 - 这可能是混淆的根源 - ForEach-Object cmdlet 调用的正文中 - 作为的一部分管道 - 而不是foreach 语句,规则发生变化, return确实只会退出手头的迭代并继续使用下一个输入对象:

> 1, 2, 3 | ForEach-Object { return $_ }
1
2
3
  • 请注意,即使在这种情况下,return $_只是$_; return的语法糖 - 即输出生成语句后跟控制流语句,只需使用$_可能就够了。

  • 请勿将break / continueForEach-Object cmdlet 一起使用,因为这些语句会查找封闭 loop 语句(例如foreachdo,while`)和 - 如果没有 - 退出整个脚本