You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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]$_ }

逻辑解释

  1. 拆分与过滤:先把输出按行拆分,过滤掉空行和没有冒号的无效行;
  2. 安全分割键值:用-split ': ', 2只分割一次,避免像Formula这类值里的冒号干扰拆分;
  3. 转换为对象:通过分组转哈希表再转自定义对象的方式,完美保留原始带空格的属性名(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:52:28