Invoke-RestMethod和foreach循环

问题描述 投票:1回答:1

通过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
}
rest powershell
1个回答
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的,因为这些语句会找一个封闭的循环语句(如foreachdo,while`)和 - 在没有一个 - 退出整个脚本。 不幸的是,没有直接的方法来提前退出管道, - 看https://github.com/PowerShell/PowerShell/issues/3821;如果您认为这应该改变,请在那里听到您的声音。
© www.soinside.com 2019 - 2024. All rights reserved.