通过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
}
答案 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
/ continue
与ForEach-Object
cmdlet 一起使用,因为这些语句会查找封闭 loop 语句(例如foreach
,do
,while`)和 - 如果没有 - 退出整个脚本。