gpt4 book ai didi

powershell - Powershell ConvertTo-Json缺少方括号并添加新字符

转载 作者:行者123 更新时间:2023-12-02 23:07:31 25 4
gpt4 key购买 nike

在贡献者@ mklement0和@Theo的帮助下,通过在Powershell ConvertTo-Json problem with double-quotation marks这个问题中解释的解决方案,我可以获得良好的结果。

但是由于JSON格式的要求,我还有两个问题:

  • 带有mac-和ip-addresss的值应该在方括号([])之间指出,并且每个值都应该在(“”)之间指出,例如:

  • "mac_address":  ["00:10:XX:10:00:0X", "X0:X0:11:X0:00:0X", "X0:11:X0:11:XX:11"]
  • 在file.txt中,我还将具有以下键值信息:

  • product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE

    我在上述问题中使用了当前代码,并且在开始时得到了两个反斜杠和一个新的反斜杠:

    "product_executable":  "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE\" /!REMEDIATE"

    我已经尝试处理哈希表输出($ oht)失败,并且尝试修改添加和删除字符。

    我的file.txt包含以下结构化信息(开头也有两个空行):



    adapter_name : empty1
    route_age : 10
    route_nexthop : 172.0.0.1
    route_protocol : NETMGMT1
    speed : null
    mac_address : 11:10:XX:10:00:0X, X1:X0:11:X0:00:0X, X1:11:X0:11:XX:11
    product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE

    adapter_name : empty2
    route_age : 100
    route_nexthop : 172.0.0.2
    route_protocol : NETMGMT2
    speed : null
    mac_address : 22:10:XX:10:00:0X, X2:X0:11:X0:00:0X, X2:11:X0:11:XX:11
    product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE

    adapter_name : empty3
    route_age : 1000
    route_nexthop : 172.0.0.3
    route_protocol : NETMGMT3
    speed : null
    mac_address : 33:10:XX:10:00:0X, X3:X0:11:X0:00:0X, X3:11:X0:11:XX:11
    product_executable : "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE

    当前代码(请参阅提到的问题)是:

    # Read the input file as a whole (-Raw) and split it into blocks (paragraphs)
    (Get-Content -Raw C:\scripts\file.txt) -split '\r?\n\r?\n' -ne '' |
    ForEach-Object { # Process each block
    # Initialize an ordered hashtable for the key-values pairs in this block.
    $oht = [ordered] @{}
    # Loop over the block's lines.
    foreach ($line in $_ -split '\r?\n' -ne '') {
    # Split the line into key and value...
    $key, $val = $line -split ':', 2
    # ... and add them to the hashtable.
    $oht[$key.Trim()] = $val.Trim()
    }
    $oht # Output the hashtable.
    } | ConvertTo-Json

    实际结果是:

        [
    {
    "adapter_name" : "empty1",
    "route_age" : 10,
    "route_nexthop" : "172.0.0.1",
    "route_protocol" : "NETMGMT1",
    "speed" : null,
    "mac_address" : "11:10:XX:10:00:0X, X1:X0:11:X0:00:0X, X1:11:X0:11:XX:11",
    "product_executable" : "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE" /!REMEDIATE"
    },
    {
    "adapter_name" : "empty2",
    "route_age" : 100,
    "route_nexthop" : "172.0.0.2",
    "route_protocol" : "NETMGMT2",
    "speed" : null,
    "mac_address" : "22:10:XX:10:00:0X, X2:X0:11:X0:00:0X, X2:11:X0:11:XX:11",
    "product_executable" : "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE" /!REMEDIATE"
    },
    {
    "adapter_name" : "empty3",
    "route_age" : 1000,
    "route_nexthop" : "172.0.0.3",
    "route_protocol" : "NETMGMT3",
    "speed" : null,
    "mac_address" : "33:10:XX:10:00:0X, X3:X0:11:X0:00:0X, X3:11:X0:11:XX:11",
    "product_executable" : "\"C:\\Program Files (x86)\\McAfee\\VirusScan Enterprise\\SHSTAT.EXE" /!REMEDIATE"
    }
    ]

    预期结果是:

        [
    {
    "adapter_name" : "empty1",
    "route_age" : 10,
    "route_nexthop" : "172.0.0.1",
    "route_protocol" : "NETMGMT1",
    "speed" : null,
    "mac_address" :  ["11:10:XX:10:00:0X", "X1:X0:11:X0:00:0X", "X1:11:X0:11:XX:11"],
    "product_executable" : ""C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE"
    },
    {
    "adapter_name" : "empty2",
    "route_age" : 100,
    "route_nexthop" : "172.0.0.2",
    "route_protocol" : "NETMGMT2",
    "speed" : null,
    "mac_address" :  ["22:10:XX:10:00:0X", "X2:X0:11:X0:00:0X", "X2:11:X0:11:XX:11"],
    "product_executable" : ""C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE"
    },
    {
    "adapter_name" : "empty3",
    "route_age" : 1000,
    "route_nexthop" : "172.0.0.3",
    "route_protocol" : "NETMGMT3",
    "speed" : null,
    "mac_address" :  ["33:10:XX:10:00:0X", "X3:X0:11:X0:00:0X", "X3:11:X0:11:XX:11"],
    "product_executable" : ""C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE"
    }
    ]

    非常感谢您的建议。

    最佳答案

    briantist's helpful answer显示product_executable属性值已正确进行JSON编码。

    至于将mac_address转换为字符串数组的愿望:只需将分隔符的值拆分为一个数组即可:

    即,代替:

    $oht[$key.Trim()] = $val.Trim()

    使用
    $oht[$key.Trim()] = $($val.Trim() -split ', ')

    如果元素之间的空白量可能是可变的,请使用 -split ',\s*' $(...)可确保如果 -split操作仅返回1个元素-即,如果输入不包含 -输入字符串将按原样而不是作为单元素数组返回。

    以上假设:
  • 应该将所有包含的属性值解析为数组
  • ,如果mac_address恰好只包含一个条目,则应将其解析为标量。

  • 以下变体仅将数组解析应用于属性 mac_address,并且始终将其值解析为数组(您可以再次将 -split操作与 $(...)包围以进行更改):
    $oht[$key.Trim()] = 
    if ($key.Trim() -eq 'mac_address') { $val.Trim() -split ', ' } else { $val.Trim() }

    关于powershell - Powershell ConvertTo-Json缺少方括号并添加新字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58044886/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com