如何在PowerShell中将IBM Tivoli命令的键值对输出转为对象
简洁优雅的PowerShell实现方案
这里有个完美适配你场景的实现方式,既能保留带空格的属性名,又能正确处理空值,最终输出标准的PowerShell自定义对象,方便后续用Where-Object等工具筛选:
# 把IBM Tivoli命令的输出内容赋值给变量(替换成你实际的输出即可) $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 : "@ # 核心转换逻辑 $tivoliObject = $tivoliOutput -split "`n" | # 过滤空行和无效行(确保只处理带冒号的键值对行) Where-Object { $_ -match '\s*:.+' } | ForEach-Object { # 只按第一个": "分割,避免值里的冒号破坏结构 $key, $value = $_ -split ': ', 2 # 输出临时对象用于后续分组 [PSCustomObject]@{ PropertyName = $key.Trim() PropertyValue = $value.Trim() } } | # 把键值对转成哈希表,保证属性名和值一一对应 Group-Object -AsHashTable -AsString -Property PropertyName | # 最终转换成标准的PS自定义对象 ForEach-Object { [PSCustomObject]$_ }
逻辑解释
- 拆分与过滤:先把输出按行拆分,过滤掉空行和没有冒号的无效行;
- 安全分割键值:用
-split ': ', 2只分割一次,避免像Formula这类值里的冒号干扰拆分; - 转换为对象:通过分组转哈希表再转自定义对象的方式,完美保留原始带空格的属性名(比如
Full Name、Sampling Interval),空值也会被正确保留为空字符串。
使用示例
转换完成后,你就可以像操作普通PowerShell对象一样筛选了:
# 筛选TEC级别为Warning的记录 $tivoliObject | Where-Object { $_.'TEC Severity' -eq 'Warning' } # 查看Formula属性的具体内容 $tivoliObject.Formula
批量处理多条记录
如果你的命令输出包含多个这样的键值对块(块之间用空行分隔),只需要稍微修改代码即可批量转换:
# 假设原始输出包含多个记录块 $multiRecordOutput = @" 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 : Name : NT_Paging_File_Critical Full Name : Description : Knt:KNT1341 Type : Windows OS Formula : *IF *VALUE NT_Paging_File.%_Usage *GE 90 Sampling Interval : 0/0:15:0 Run At Start Up : Yes Distribution : Text : CRITICAL("knt:"+$ISITSTSH.SITNAME$); Action Location : Agent Action Selection : System Command System Command : *NONE True For Multiple Items: Action on First Item only TEC Severity : Critical TEC Forwarding : TEC Destination : "@ # 批量转换为对象数组 $tivoliObjects = $multiRecordOutput -split "`n`n" | Where-Object { $_ -notmatch '^\s*$' } | ForEach-Object { $_ -split "`n" | Where-Object { $_ -match '\s*:.+' } | ForEach-Object { $key, $value = $_ -split ': ', 2 [PSCustomObject]@{ PropertyName = $key.Trim() PropertyValue = $value.Trim() } } | Group-Object -AsHashTable -AsString -Property PropertyName | ForEach-Object { [PSCustomObject]$_ } } # 示例:筛选所有TEC级别为Critical的记录 $tivoliObjects | Where-Object { $_.'TEC Severity' -eq 'Critical' }
内容的提问来源于stack exchange,提问作者That Robin
相关产品推荐
相关产品推荐

