PowerShell 技能连载 - 使用 GeoCoding:将经纬度转换为地址(第 3 部分)
今天,我们要做相反的事情,把经纬度转换成一个地址:
1 | '52.37799,9.75195' | |
今天,我们要做相反的事情,把经纬度转换成一个地址:
1 | '52.37799,9.75195' | |
让我们从将地址转换为经纬度坐标开始。我们假设您已经阅读了前面的部分以完全理解代码示例。
下面是一些示例代码,它接受任意数量的地址,并返回它们的经纬度:
1 | 'One Microsoft Way, Redmond', |
结果看起来类似这样:
Address Long Lat
------- ---- ---
One Microsoft Way, Redmond -122.13061 47.64373
Bahnhofstrasse 12, Hannover, Germany 9.75195 52.37799
去年,Google 改变了他们的服务条款,要求使用一个独立的 API 入口来使用他们的 geocode API。幸运的是,还有免费的替代,所以在这个迷你系列中我们想向您展示 PowerShell 可以如何处理地址和坐标。
所有这些功能需要 REST API 调用,所以无论需要通过 REST API 发送什么信息,都需要先编码成能做为 Web URL 的一部分发送的格式。
我们先聚焦在如何将文本编码为 REST API 调用的一部分:
1 | $address = 'Bahnhofstrasse 12, Hannover' |
当您查看结果时,您可以很容易地看到进行了许多修改:
Bahnhofstrasse+12%2C+Hannover
有些时候,Web Request 在浏览器中可以正常工作,但是在 PowerShell 中却不能。例如,当您在浏览器中导航到 http://www.geocode.xyz/Bahnhofstrasse,Hannover?json=1,可以获得 JSON 格式的坐标地址。
而当在 PowerShell 中做同样操作时,会得到奇怪的异常:
1 | $url = 'http://www.geocode.xyz/Bahnhofstrasse,Hannover?json=1' |
结果如下:
1 | Invoke-RestMethod : { "success": false, "error": { "code": "006", "message": "Request Throttled." } } |
这里的秘密是需要先获取会话状态,会话状态包括 cookie 和其它细节,然后再根据会话状态重新提交 Web Service 请求。以下是它的工作方式:
1 | $url = 'http://www.geocode.xyz' |
现在结果看起来正确了:
1 | standard : @{stnumber=1; addresst=Bahnhofstrasse; postal=30159; region=DE; prov=DE; city=Hannover; |
当使用比较运算符时,请确保明确的部分放在左边。这是因为 PowerShell 查找运算符的左边并且可能会自动改变右侧的数据类型。并且,当左侧是数组类型时,比较运算符可以作为过滤器使用。
请查看差异:
1 | $array = @() |
由于要比较数组,比较操作符的工作原理类似于过滤器,在第一个比较中不返回任何内容。而当您交换操作数,结果会返回 $false
,这才是正确的答案:一个数组,甚至是一个空的数组,不等于 null。
当一个用户锁定或者解锁机器时,Windows 会发出事件。PowerShell 可以订阅这些事件并且进行操作,例如使用文字转语音引擎来发出问候。
但是还有许多有用的操作。您也许希望在锁定计算机时做清理操作,关闭所有的 Windows 资源管理器窗口,开始备份,或做其它事情。以下是示例代码:
1 | function Start-LogMessage { |
Windows 更新客户端维护了它自己的已安装更新。下面的示例代码不是查询一般的系统事件日志,也不是主动搜索可能需要一些时间的更新,而是查询和读取 Windows Update 客户端的安装历史:
1 | $Session = New-Object -ComObject Microsoft.Update.Session |
Get-Hotfix
返回已安装的更新,但实际上只是 Win32 Win32_QuickFixEngineering
WMI 类的一个包装器。它并不会返回所有已安装的更新。
一个更好的方法可能是查询事件日志:
1 | Get-EventLog -LogName System -InstanceId 19 | |
虽然这可能不完整,并且事件日志项有可能被清除。唯一权威的答案可能来自 Windows Update 客户端,它实际上是查看系统中的文件:
1 | $pattern = 'KB\d{6,9}' |
PowerShell 可以使用 Windows Update 客户端相同逻辑查询缺少的更新:
1 | $UpdateSession = New-Object -ComObject Microsoft.Update.Session |
下面是返回更新标题和知识库编号(如果可用)的更复杂的方法:
1 | $UpdateSession = New-Object -ComObject Microsoft.Update.Session |
有没有想过为什么 CPU 负载有时会这么高,或者为什么黑色的窗口会一闪而过?我们可以检查程序启动的事件日志,并找出什么时候什么程序自动启动了:
1 | Get-EventLog -LogName System -InstanceId 1073748869 | |