我有这个PowerShell代码:
$uri = "http://charts.spotify.com/api/tracks/most_streamed/au/daily/latest"
$ContentType = "application/json"
$postblog = (Invoke-WebRequest -Uri $uri).Content -match 'track_name\S:\S(.*?)",'
$matches[1]
当我运行这个时,我得到了这个结果:
FourFiveSeconds
问题是,我知道有更多的歌曲而不仅仅是这首歌。我知道我正在使用的比赛,文字字符串" track_name "存在不止一次。如何更改我的RegEx以使其匹配它可以找到的每个匹配?换句话说,预期输出将是多个匹配,允许我列出所有歌曲,例如$matches[1]
,$matches[2]
,$matches[3]
,$matches[4]
等。
答案 0 :(得分:4)
由于您使用的是Invoke-WebRequest
,我假设您使用的是Powershell v4.0。因此,您可以对收到的数据使用ConvertFrom-Json
并对其进行迭代,而不是使用正则表达式解决方案:
$uri = "http://charts.spotify.com/api/tracks/most_streamed/au/daily/latest"
$ContentType = "application/json"
$postblog = (Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Json
现在,整个tracks
数据在$postblog.tracks
数组中可用。
迭代它们以获得track_url
s:
Foreach( $track in $postblog.tracks ) {
Write-Output $track.track_url
}
显然,你可以简单地使用:
Write-Output $postblog.tracks.track_url
而不是Foreach
代码块。感谢@PetSerAl:)
答案 1 :(得分:0)
感谢所有人,是的,你是对的,将它转换为JSON给了我更多的选择,它比使用RegEx更清晰。
我现在有这个脚本,这绝对应该可以解决问题。
$spotifytopsongs = @()
$uri = "http://charts.spotify.com/api/tracks/most_streamed/au/daily/latest"
$ContentType = "application/json"
$spotifyjson = (Invoke-WebRequest -Uri $uri).Content | ConvertFrom-Json
$spotifyjson.tracks | select -First 50 | % {$spotifytopsongs += @($_.artist_name + " - " + $_.track_name)}
cls;$spotifytopsongs