首页 > 解决方案 > PowerShell:从 API 响应中检索特定单词并编译成 HTML 表

问题描述

我正在尝试从 API 中检索特定的单词,不幸的是 API 响应只是一个包含以下文本的正文响应 - 示例如下:

他们发现这是由于第 3 方工作室 Square Melon 存在问题,该工作室已联系并正在寻求解决方案。问题解决后将进行更新,等待团队的反馈。
事故指挥官:Barrie James
Remedy INC1063757 PD 387049

检索“Barrie James”和 INC 编号 (INC1063757) 的最佳方法是什么。不幸的是,我已经坚持了一段时间,因为可能有多个不同的事件,这意味着名称和 INC 编号将会改变。

有任何想法吗?

标签: powershell

解决方案


假设您将此 API 的响应分配给一个变量 ,$response我们首先需要将其从一个字符串分解为一个字符串数组,我们将这样做。

 $response = Invoke-RestMethod -uri www.mycoolsite.com #or maybe Invoke-WebRequest
 $response
 >They have found that this is due to in issue with the 3rd party Studio, Square Melon, who have been contacted and are working on a solution. Updates to follow once the issue has been resolved, pending feedback from the teams.
Incident Commander: Barrie James
Remedy INC1063757 PD 387049

 $response.Count
 >1

 #we need response to be an array of strings for Select-string to work.  
 $response.Split("`n").Count
 >3

我们Split()在变量上调用了该方法,$response并在它看到隐藏的'nPowerShell 换行符的任何地方将其分解。

接下来,我们可以使用|管道字符将字符串数组发送到Select-String并查找其中包含特定字符串的行。

$response.Split("`n") | select-string "Incident Commander:"

这会将结果解析为有用的东西,如下所示。

$response.Split("`n") | select-string "Incident Commander:"
IgnoreCase : True
LineNumber : 2
Line       : Incident Commander: Barrie James
Filename   : InputStream
Path       : InputStream
Pattern    : Incident Commander:
Context    : 
Matches    : {0}

从这里,我们只需选择 line 属性,其中包含文本Incident Commander: Barrie James

($response.Split("`n") | select-string "Incident Commander:").Line
>Incident Commander: Barrie James

剩下的就是去掉冒号,我们将使用该.Split()方法来完成。这将在看到我们提供的字符的任何地方将字符串分成单独的字符串。

($response.Split("`n") | select-string "Incident Commander:").Line.Split(":")
Incident Commander
 Barrie James

现在,只选择第二个项目,我们用索引来做。PowerShell 中的索引从零开始(当然),所以我们实际上要求“索引 1 处的项目”,这意味着第二个位置。

($response.Split("`n") | select-string "Incident Commander:").Line.Split(":")[1].Trim()
Barrie James

你去吧。这就是您的做法,也是我们执行每一步的原因。


推荐阅读