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

标签 powershell

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

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

  1. mac 和 ip 地址的值应在方括号 ([ ]) 之间指示,并且每个值应在 ("") 之间指示,例如:
"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"
          }
        ]
    

    我非常感谢您的建议。

    最佳答案

    JSON 中的字符串可以采用转义序列。指定转义序列的字符是反斜杠\

    转义序列的用途包括:

    • 插入不可打印或空白字符(例如 TAB 或换行符或 null)
    • 在字符串中插入双引号 " (因为双引号既是字符串的开头又是结尾,因此您必须有办法说“我希望此引号成为的一部分 的字符串,而不是终止它)。
    • 插入文字反斜杠 \ (由于 backlsash 是转义序列的开头,因此您需要一种方式来表示“我希望此反斜杠成为字符串的一部分” ,而不是开始转义序列)

    因此,在您的示例中,您看到的是:

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

    1. 首先,用双引号 " 来启动 JSON 字符串。
    2. 然后紧接着 \",它表示“该字符串中的第一个字符是实际的
    3. 在本身由反斜杠 \ 分隔的路径中,您需要将其设置为双斜杠,以便可以将其解释为单个反斜杠,而不是尝试将其解释为转义序列 \P 程序文件 \M cAfee \V irusScan > 等等
    4. SHSTAT.EXE 的末尾,您会看到下一个 \",它放入了结束带引号的可执行字符串的文字引号中。

    长话短说,一切都按预期进行。当您反序列化 JSON 时,一切都会按其应有的方式显示!

    想确认一下吗?

    $myString = @'
    "C:\Program Files (x86)\McAfee\VirusScan Enterprise\SHSTAT.EXE" /!REMEDIATE
    '@
    
    Write-Host $myString
    
    $myJsonString = $myString | ConvertTo-Json
    
    Write-Host $myJsonString
    
    $undoJson = $myJsonString | ConvertFrom-Json
    
    Write-Host $undoJson
    

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

    相关文章:

    c# - 运行 "dotnet run ..."后 PowerShell 不返回命令行

    visual-studio - 用于构建 Visual Studio 项目的 PowerShell 脚本

    powershell - 使用Powershell的任何给定Windows Update的查找发布日期

    powershell - 将数据导出到CSV-每个返回值或首先将数据收集到哈希表?

    collections - 是否可以在 powershell 中向集合添加属性?

    powershell - 如何在 v2 模式下运行 PowerShell v3 控制台

    json - 为什么我生成的JSON的 “\\”太多?

    powershell - 在 powershell 中访问 $args 数组

    powershell - 安装包 : Dependency loop detected for package 'Microsoft.Data.Sqlite'

    powershell - Powershell-更改输出格式