【问题标题】:Powershell - Remove last comma in foreachPowershell - 删除 foreach 中的最后一个逗号
【发布时间】:2014-12-29 08:30:37
【问题描述】:

我对 powershell 脚本比较陌生,需要以下脚本方面的帮助。我需要从下面的结果中删除最后一个逗号“,”。这是 JSON 格式,我需要能够将此信息用于 Zabbix 监控 Hyper-V 虚拟机。

脚本:

    $colItems = Get-VM

write-host "{"
write-host " `"data`":["
write-host

foreach ($objItem in $colItems) {
    $line =  " { `"{#VMNAME}`":`"" + $objItem.Name + "`" , `"{#VMSTATE}`":`"" + $objItem.State + "`" },"
    write-host $line
}

write-host
write-host " ]"
write-host "}"
write-host

结果如下:

{ 
 "data":[

 { "{#VMNAME}":"cp01" , "{#VMSTATE}":"Off" },
 { "{#VMNAME}":"dc01" , "{#VMSTATE}":"Running" },
 { "{#VMNAME}":"ex01" , "{#VMSTATE}":"Off" },
 { "{#VMNAME}":"fc01" , "{#VMSTATE}":"Running" },
 { "{#VMNAME}":"rdg01" , "{#VMSTATE}":"Running" },
 { "{#VMNAME}":"Windows 2012R2 G2 Template" , "{#VMSTATE}":"Off" }, <--- THIS I WANT TO REMOVE

 ]
}

【问题讨论】:

    标签: json powershell zabbix


    【解决方案1】:

    JSON 不是一个扁平字符串,永远不要试图通过连接扁平字符串来构建它,并希望它最终会没事。

    JSON 是一个序列化的数据结构,这样对待。制作数据结构并序列化。

    在您的情况下,数据结构应该是包含键 data 的对象(即哈希表),而该键又包含对象数组。这很容易做到。

    $result = @{}
    $result.data = @()
    
    foreach ($vm in Get-VM) {
        $result.data += @{
            "{#VMNAME}" = $vm.Name;
            "{#VMSTATE}" = $vm.State;
        }
    }
    
    $result | ConvertTo-Json
    

    完成。


    另一种表示法,使用foreach简写%,保存临时变量和几行:

    @{
        "data" = Get-VM | % { 
            @{
                "{#VMNAME}" = $_.Name;
                "{#VMSTATE}" = $_.State;
            }
        }
    } | ConvertTo-Json
    

    【讨论】:

    • 感谢您快速正确的回答。这正是我想要的。
    • @elimat 再看看我的回答,我已经改进了一点。
    • 我明白了,非常好。谢谢你。我会记住这一点。
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2016-07-25
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多