解析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