使用 PowerShell 解析 JSON 文件
- 在 PowerShell 中下载 JSON 文件
-
在 PowerShell 中使用
Invoke-Request
命令 -
使用
Invoke-RestMethod
Cmdlet - 使用 PowerShell 解析 JSON 文件
-
在 PowerShell 中使用
Invoke-WebRequest
下载过滤后的对象
许多 API 使用称为 REST 的协议。REST APIs
主要通过 Javascript 对象表示法或简单的 JSON 以一种语言进行交谈。
本文展示了如何使用 Windows PowerShell 直接与 REST API
对话并将数据转换为有用的东西。
JSON 是一种缩小人类可读数据和机器可读数据之间差距的方法。
在结构化数据对象之前,大多数操作系统依赖于文本解析工具,这些工具使用复杂的正则表达式 regex
来为简单文本带来结构。
我们现在可以使用 JSON 创建一个人类和程序都可以相对轻松地读取的字符串。
{
"string": "this is a string. backslashes (\\) have to be escaped",
"object": {
"description": "This is a sample object nested inside our javascript object. Description is a string subproperty"
},
"numbers": 12345,
"array": ["a string", "another string"]
}
JSON 易于读写,尽管有许多引号、逗号、括号和转义字符。
在 PowerShell 中下载 JSON 文件
首先,从 GitHub 获取一个使用 Invoke-RestMethod
命令的示例 JSON 到 PowerShell。
但是,了解如何转换 JSON 字符串仍然很重要。
在 PowerShell 中使用 Invoke-Request
命令
要使用 Windows PowerShell 查询 API 并获取一些 JSON 作为回报,请使用 Invoke-WebRequest
命令。
此命令可以通过 HTTP 查询任何 Web 服务或站点并返回信息(不仅仅是 JSON)。我们将使用这个示例来获取一些可以使用的 JSON。
- 打开 PowerShell 控制台。
- 运行
Invoke-WebRequest
命令查询 GitHub API,如下图所示。下面的代码片段将 cmdlet 返回的所有输出分配给$webData
变量进行处理。
$webJSONData = Invoke-WebRequest -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"
执行 ConvertFrom-Json
命令将存储在 content 属性中的 JSON 字符串转换为 PowerShell 对象。
$releases = ConvertFrom-Json $webJSONData.content
通过管道将 Windows PowerShell 对象传递给 Get-Member
命令。当你这样做时,我们将看到该对象是 System.Management.Automation.PSCustomObject
类型;不仅仅是一个简单的字符串。
$releases | Get-Member
使用 Invoke-RestMethod
Cmdlet
使用 Invoke-RestMethod
命令与 Invoke-WebRequest
非常相似。它只消除了一行代码。
该 cmdlet 将自动假定一个 JSON 响应并为你转换它。
它在代码中阐明了你期望使用 API,并且你还期望 JSON 响应。
- 打开你的 PowerShell 控制台
- 运行
Invoke-RestMethod
获取发布信息
$releases_2 = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"
通过管道将 Windows PowerShell 对象传递给 Get-Member
命令。当你这样做时,我们将看到该对象是 System.Management.Automation.PSCustomObject
类型;不仅仅是一个简单的字符串。
$releases_2 | Get-Member
使用 PowerShell 解析 JSON 文件
让我们看一下上一节中定义的 $releases
变量。两个突出的属性是 browser_download_url
和 name
属性。
browser_download_url
属性与 URL 相关,而 name
属性可能与版本名称相关。
现在输出所有的 name
属性,如下所示。
$releases_2.assets.name
在 PowerShell 中使用 Invoke-WebRequest
下载过滤后的对象
## Using Invoke-RestMethod
$webAPIData = Invoke-RestMethod -Uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest"
## Using Invoke-WebRequest
$webAPIData = ConvertFrom-JSON (Invoke-WebRequest -uri "https://api.github.com/repos/PowerShell/PowerShell/releases/latest")
## The download information is stored in the "assets" section of the data
$assets = $webAPIData.assets
## The pipeline operator is used to filter the assets object to find the release version
$asset = $assets | where-object { $_.name -match "win-x64" -and $_.name -match ".zip"}
## Download the latest version
Write-output "Downloading $($asset.name)"
Invoke-WebRequest $asset.browser_download_url -OutFile "$pwd\$($asset.name)"
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn