需要 PowerShell 像提供 API 的网页服务发送请求,收到返回的值后,对其进行处理。

例如,我需要使用和风天气的 API,获得本地的天气数据,将会收到 JSON 格式的返回值。

Invoke-WebRequest

使用Help *Web*不难发现Invoke-WebRequest这个 Cmdlet,根据一般的简写规则——大写字母(单词首字母)组合——也可以猜出其简写是iwr

键入help Invoke-WebRequest,浏览帮助,只其用法为iwr -uri <uri:>-Form-Header参数名可提供网页 API 需要的参数。

结合 API 文档,本例需要的第一个命令为iwr 'https://devapi.qweather.com/v7/astronomy/now?location=id&key=<key>'

ConvertFrom-JSON

执行上述的命令,得到如下返回值:

我们需要的是 Content 部分,因此用.号表示属性:

(iwr 'https://devapi.qweather.com/v7/astronomy/now?location=id&key=<key>').Content

Content 部分按 JSON 格式返回,在终端中显示异常,需要用ConvertFrom-JSON格式化:

(iwr 'https://devapi.qweather.com/v7/astronomy/now?location=id&key=<key>').Content | ConvertFrom-JSON

-ExpandProperty

这还不够,真正有用的信息是在 Now 组中,对此我们需要用Select-Object -ExpandProperty将它展开。命令为:

(iwr 'https://devapi.qweather.com/v7/astronomy/now?location=id&key=<key>').Content | ConvertFrom-JSON |Select-Object -ExpandProperty now 

要引用其中的值,再用.指定属性即可。

$Weather = (iwr 'https://devapi.qweather.com/v7/astronomy/now?location=id&key=<key>').Content | ConvertFrom-JSON |Select-Object -ExpandProperty now
$WeatherTemp = $Weather.temp

附录:使用IWR创建 PowerShell IP 查询脚本

<#
	.Description
	使用 cip.cc 的服务,通过获得的 HTML 文本,格式化为有用的信息。
	
	.Sy
#>

param (
 [string]$IP
)

$Info = (iwr "https://www.cip.cc/$IP").Content
if($?){ # 仅当 IWR 成功时,才进行下一步的格式化操作
 $StartFrom = $Info.Indexof('<pre>') + 5
 $EndWith = $Info.Indexof('URL   :') - $StartFrom # 起始字符位置和长度
 ($Info.Substring($StartFrom,$EndWith)).Replace("`n`n","`n") # 替换多个换行符为一个
}