解析Powershell变量

解析Powershell变量,powershell,string-formatting,Powershell,String Formatting,你们都帮了大忙——让我先这么说吧 我从运行的函数中获得以下输出-数据存储在名为$response的变量中,该变量从调用RestMethod调用中获得 @{ResourceType=UserStory; Id=202847; Name=Professional Lines: 2,800,000 Policy Aggregate Limit update} 如何将这些值解析为新变量,以便最终结果是 TP Id:202847 Professional Lines: 2,800,000 Pol

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

我从运行的函数中获得以下输出-数据存储在名为
$response
的变量中,该变量从
调用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

您显示的是自定义对象的字符串化形式,它使用类似哈希表的文本表示法

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

# 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]中的表示法-请注意,如果将对象传递给cmdlet,您将得到相同的表示法[2]:

请注意,没有封装的
“…”
,借助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
请注意,需要在属性引用周围使用
$(…)
——有关PowerShell字符串扩展规则的摘要,请参阅


另一种方法是使用
-f
操作符
,它使用格式化字符串,如.NET方法:


[1] 您还可以通过对自定义对象调用
.psobject.ToString()
来获得此表示形式;奇怪的是,从PowerShell Core 6.1.0开始,仅仅
.ToString()
不起作用;这一令人惊讶的差异在本文中进行了讨论


[2] 请注意,
Write Host
的目的是提供仅显示(到主机)输出,绕过PowerShell的成功输出流,从而能够捕获或重定向其输出-有关更多信息,请参阅。

这个问题似乎缺乏上下文。
$response
是如何创建的?它看起来像一个哈希表。因此,它现在应该处于非常可用的状态,例如,
$response.ResourceType
一天结束时只需要3个变量?你打算用它们做什么?所以您想要一个平面字符串作为输出?副本中是否有删除的等号?为什么需要从非常有用的哈希表中提取值?您可以通过
$Response['Resource Type']
对它们进行寻址,以获取
UserStory
值。只需按键寻址即可获得值。//如果需要在一行上显示它们,那么使用字符串格式操作符来构建所需的字符串;它实际上是自定义对象的字符串化版本(例如,
“$([pscustomobject]@{one=1;two=2})”
PS> "TP Id:$($response.Id) $($response.Name)"
TP Id:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update
PS> 'TP ID:{0} {1}' -f $response.Id, $response.Name
TP ID:202847 Professional Lines: 2,800,000 Policy Aggregate Limit update