【问题标题】:Parsing a Powershell variable解析 Powershell 变量
【发布时间】:2019-04-06 00:41:51
【问题描述】:

你们都帮了大忙——让我先这么说吧。

我从我运行的函数中得到以下输出 - 数据存储在一个名为 $response 的变量中,该变量是从 Invoke-RestMethod 调用中获得的。

@{ResourceType=UserStory; Id=202847; Name=Professional Lines: 2,800,000 Policy Aggregate Limit update}    

如何将这些值解析为新变量,以便最终结果是

TP Id:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update

【问题讨论】:

  • 这个问题似乎缺乏上下文。 $reponse 是如何创建的?它看起来像一个哈希表。因此它现在应该处于非常可用的状态,例如$response.ResourceType您一天结束时只想要 3 个变量?你打算怎么处理他们?所以你想要一个扁平的字符串来输出?副本中是否有等号被删除?
  • 为什么需要从它们非常有用的哈希表中提取值?您可以通过$Response['Resource Type'] 解决它们以获得UserStory 值。只需通过 Key 对它们进行寻址即可获得 Value。 ///// 如果你需要在一行上显示,那么使用字符串格式操作符来构建你想要的字符串。
  • 看起来像一个哈希表,但它不是一个;它实际上是 自定义对象 的字符串化版本(例如,"$([pscustomobject] @{ one = 1; two = 2 })"

标签: powershell string-formatting


【解决方案1】:

您展示的是 自定义对象字符串化形式,它使用 hashtable-like 文本表示

该自定义对象的定义如下所示:

# Construct a custom object with .ResourceType, .Id, and .Name properties.
$response = [pscustomobject] @{
  ResourceType = 'UserStory'
  Id = 202847
  Name = 'Professional Lines: 2,800,000 Policy Aggregate Limit update'
}

如果您将此变量包含在一个可扩展字符串(插值字符串)中,您将获得问题中的表示[1] - 请注意,如果将对象传递给 Write-Host cmdlet,您将获得相同的表示形式[2]

PS> "$response"  # Note the enclosing "..."
@{ResourceType=UserStory; Id=202847; Name=Professional Lines: 2,800,000 Policy Aggregate Limit update}

请注意,如果没有封闭的 "...",您将获得更好的表格表示,这要归功于 PowerShell 的输出格式系统。

PS> $response  # direct output of the object

ResourceType     Id Name
------------     -- ----
UserStory    202847 Professional Lines: 2,800,000 Policy Aggregate Limit update

假设$response 实际上仍然是一个自定义对象,而不是它的字符串表示,您可以简单地访问自定义对象的属性来构建您的字符串,再次使用可扩展字符串

PS> "TP Id:$($response.Id) $($response.Name)"
TP Id:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update

注意需要在属性引用周围使用$(...) - 请参阅this answer 了解 PowerShell 字符串扩展规则的摘要。


另一种方法是使用 -f 运算符,它使用格式字符串,如 .NET String.Format() 方法:

PS> 'TP ID:{0} {1}' -f $response.Id, $response.Name
TP ID:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update

[1] 您也可以通过在自定义对象上调用.psobject.ToString() 来获取此表示;奇怪的是,从 PowerShell Core 6.1.0 开始,只是 .ToString() 不起作用; this GitHub issue 讨论了这种令人惊讶的差异。

[2] 请注意,Write-Host 的目的是提供 for-display-only(到主机)输出,它绕过 PowerShell 的成功输出流,从而捕获或重定向其输出的能力 - 请参阅 this answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2019-07-30
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多