通过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
}
正如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
/ continue
与ForEach-Object
cmdlet的,因为这些语句会找一个封闭的循环语句(如foreach
,do
,while`)和 - 在没有一个 - 退出整个脚本。
不幸的是,没有直接的方法来提前退出管道, - 看https://github.com/PowerShell/PowerShell/issues/3821;如果您认为这应该改变,请在那里听到您的声音。