【问题标题】:PowerShell create nested JSONPowerShell 创建嵌套 JSON
【发布时间】:2016-09-02 06:57:54
【问题描述】:

我正在尝试在 PowerShell 中创建一个 JSON 对象,以便可以在 python 脚本中使用它。 我的结果好坏参半,我正在尝试将其压缩为一个命令,以便我可以从我的 python 脚本中运行

ForEach ($disk in (Get-Partition).DiskNumber | select -Unique | Sort-Object)`
{ConvertTo-Json @{$disk.ToString()=`
ForEach ($part in (Get-Partition -DiskNumber $disk).PartitionNumber | Sort-Object)`
{@{$disk.ToString()=Get-Partition -DiskNumber $disk -PartitionNumber $part | `
ForEach-Object {ConvertTo-Json @{PartitionNumber=$_.PartitionNumber;DriveLetter=$_.DriveLetter;Offset=$_.Offset`
}}}}}}

这是我得到的输出:

{
    "0":  [
              {
                  "1":  "{\r\n    \"DriveLetter\":  null,\r\n    \"Offset\":  17408,\r\n    \"PartitionNumber\":  1\r\n}"
              },
              {
                  "2":  "{\r\n    \"DriveLetter\":  \"F\",\r\n    \"Offset\":  135266304,\r\n    \"PartitionNumber\":  2\r\n}"
              }
          ]
}
{
    "1":  [
              {
                  "1":  "{\r\n    \"DriveLetter\":  null,\r\n    \"Offset\":  1048576,\r\n    \"PartitionNumber\":  1\r\n}"
              },
              {
                  "2":  "{\r\n    \"DriveLetter\":  null,\r\n    \"Offset\":  315621376,\r\n    \"PartitionNumber\":  2\r\n}"
              },
              {
                  "3":  "{\r\n    \"DriveLetter\":  null,\r\n    \"Offset\":  419430400,\r\n    \"PartitionNumber\":  3\r\n}"
              },
              {
                  "4":  "{\r\n    \"DriveLetter\":  \"C\",\r\n    \"Offset\":  553648128,\r\n    \"PartitionNumber\":  4\r\n}"
              }
          ]
}
{
    "2":  [
              {
                  "1":  "{\r\n    \"DriveLetter\":  null,\r\n    \"Offset\":  17408,\r\n    \"PartitionNumber\":  1\r\n}"
              },
              {
                  "2":  "{\r\n    \"DriveLetter\":  \"D\",\r\n    \"Offset\":  135266304,\r\n    \"PartitionNumber\":  2\r\n}"
              }
          ]
}

问题是 ConvertTo-Json 在第一个键内创建一个列表/数组,并为该列表内的每个对象创建一个字典,有什么办法可以克服这个问题吗? 我可以删除换行符,所以这不是一个大问题。 这是我希望它的外观:

{
        "0":
            "1":  {"DriveLetter": null, "Offset": 17408, "PartitionNumber": 1},
            "2":  {"DriveLetter": "F", "Offset": 135266304, "PartitionNumber": 2}
    }
    {
        "1":
            "1":  {"DriveLetter": null, "Offset": 1048576, "PartitionNumber":  1},
            "2":  {"DriveLetter": null, "Offset": 315621376, "PartitionNumber":  2},
            "3":  {"DriveLetter": null, "Offset": 419430400, "PartitionNumber":  3},
            "4":  {"DriveLetter": "C", "Offset": 553648128, "PartitionNumber":  4}
    }
    {
        "2": 
            "1":  {"DriveLetter": null, "Offset": 17408, "PartitionNumber": 1},
            "2":  {"DriveLetter": "D", "Offset": 135266304, "PartitionNumber": 2}
    }

【问题讨论】:

  • 这是正确的输出,但您想要的输出甚至不是正确的 JSON 语法。

标签: json powershell


【解决方案1】:

您的代码目前存在 3 个问题。

首先,您调用ConvertTo-Json(至少)两次 - 一次在内部分区哈希表上,然后再次在外部哈希表上。

其次,你没有指定Depth,意味着内部字典会被折叠。

最后,如果你想要你描述的输出,你应该使用分区号$part作为第二级字典的键:

foreach ($disk in (Get-Partition).DiskNumber | select -Unique | Sort-Object){
  ConvertTo-Json -Depth 3 @{
    "$disk" = foreach ($part in (Get-Partition -DiskNumber $disk).PartitionNumber | Sort-Object){
      @{
        "$part" = Get-Partition -DiskNumber $disk -PartitionNumber $part | ForEach-Object {
          @{
            PartitionNumber = $_.PartitionNumber;
            DriveLetter     = $_.DriveLetter;
            Offset          = $_.Offset
          }
        }
      }
    }
  }
}

以上将为n 磁盘生成n 离散JSON 结构。


如果您想要一个以磁盘阵列为根对象的单一结构,请将 ConvertTo-Json 移到整个表达式之外:

ConvertTo-Json -Depth 4 @(foreach ($disk in (Get-Partition).DiskNumber | select -Unique | Sort-Object){
  @{
    "$disk" = foreach ($part in (Get-Partition -DiskNumber $disk).PartitionNumber | Sort-Object){
      @{
        "$part" = Get-Partition -DiskNumber $disk -PartitionNumber $part | ForEach-Object {
          @{
            PartitionNumber = $_.PartitionNumber;
            DriveLetter     = $_.DriveLetter;
            Offset          = $_.Offset
          }
        }
      }
    }
  }
})

【讨论】:

  • 非常感谢您成功了,我无法理解 -depth 的用途,本可以为我节省一些时间。
猜你喜欢
  • 2022-01-23
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2021-06-02
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多