如何从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 7 ConvertFrom-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随笔10---Module

powershell Powershell函数从文件中读取哈希表文本表示并将其转换为哈希表对象

Azure上采用Powershell从已有的VHD创建VM

从 Powershell 中的输出中删除文本

DOM:如何从 Chrome 中的复制事件中获取复制的文本?

如何从Oracle数据库中的Object Type生成XML