如何从PowerShell中的格式化文本创建对象
Posted
技术标签:
【中文标题】如何从PowerShell中的格式化文本创建对象【英文标题】:How to create an object from formatted text in powershell 【发布时间】:2020-03-19 11:21:18 【问题描述】:我有一个 IBM Tivoli 命令的输出,它实际上是一堆键和值,看起来像这样
Name : NT_Paging_File_Warning
Full Name :
Description : Knt:KNT1340
Type : Windows OS
Formula : *IF *VALUE NT_Paging_File.%_Usage *GE 75 *AND *VALUE NT_Paging_File.%_Usage *LT 0 *AND *VALUE NT_Paging_File.Pagefile_Name_U *NE _Total
Sampling Interval : 0/0:15:0
Run At Start Up : Yes
Distribution :
Text : ADVICE("knt:"+$ISITSTSH.SITNAME$);
Action Location : Agent
Action Selection : System Command
System Command : *NONE
True For Multiple Items: Action on First Item only
TEC Severity : Warning
TEC Forwarding :
TEC Destination :
我想有效地获取该输出并将其转换为具有明显属性和值的 powershell 对象。如您所见,某些值可能为空,某些属性的名称中包含空格。 :
是键和值之间的标准分隔符。
有什么好的干净的 powershell 方法来解决这个问题?
我想这样做的原因是将这些记录作为对象发送到管道中,我将在其中使用诸如 Where-Object 之类的东西来过滤掉我想要的那些等等
【问题讨论】:
这能回答你的问题吗? Trouble parsing string to object with PowerShell。另请注意,由于 PowerShell 7ConvertFrom-StringData
支持 -Delimiter
参数。
【参考方案1】:
-
使用
-split
运算符拆分(第一个):
修剪生成的字符串并使用它们填充[ordered
] 字典
将字典转换为[pscustomobject]
$tivoliOutput = @'
Name : NT_Paging_File_Warning
Full Name :
Description : Knt:KNT1340
Type : Windows OS
Formula : *IF *VALUE NT_Paging_File.%_Usage *GE 75 *AND *VALUE NT_Paging_File.%_Usage *LT 0 *AND *VALUE NT_Paging_File.Pagefile_Name_U *NE _Total
Sampling Interval : 0/0:15:0
Run At Start Up : Yes
Distribution :
Text : ADVICE("knt:"+$ISITSTSH.SITNAME$);
Action Location : Agent
Action Selection : System Command
System Command : *NONE
True For Multiple Items: Action on First Item only
TEC Severity : Warning
TEC Forwarding :
TEC Destination :
'@ -split '\r?\n'
# Prepare dictionary to hold properties
$properties = [ordered]@
foreach($line in $tivoliOutput)
# Split line into key and value
$key,$value = $line -split ':',2 |ForEach-Object Trim
# Remove spaces from the key names, comment out this line to retain names as-is
$key = $key -replace '\s'
# Add to our dictionary of properties
$properties[$key] = $value
# create object
[pscustomobject]$properties
【讨论】:
当我尝试将$properties
转换为[pscustomobject]
时出现错误,它显示Cannot convert value "System.Collections.Specialized.OrderedDictionary" to type "System.Management.Automation.LanguagePrimitives+InternalPSCustomObject". Error: "Cannot process argument because the value of argument "name" is not valid. Change the value of the "name" argument and run the operation again."
我添加了$properties | Format-Table
并且可以看到$properties
已正确填充
@ThatRobin 您使用的是什么版本的 PowerShell? ($PSVersionTable.PSVersion.ToString()
)
Version: 5.1.14409.1018 我发现我可以将它转换为另一个对象,然后将其插入管道...` [pscustomobject]$test = $properties; $test`以上是关于如何从PowerShell中的格式化文本创建对象的主要内容,如果未能解决你的问题,请参考以下文章
powershell Powershell函数从文件中读取哈希表文本表示并将其转换为哈希表对象