2016-05-07 3 views
1

Я пытаюсь создать объект JSON в PowerShell, поэтому я могу использовать его в скрипте python. У меня были смешанные результаты, я пытаюсь сжать это в одной команде, так что я могу просто запустить в моего питона сценарияPowerShell создать вложенный JSON

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} 
    } 
+1

Это правильный выход, хотя, на выходе вы хотите здесь даже не правильный синтаксис JSON. – yelsayed

ответ

3

Есть в настоящее время 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 дискретные структуры JSON для n дисков.


Move 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 
      } 
     } 
     } 
    } 
    } 
}) 
+0

Огромное спасибо, что сделал трюк, я не мог понять, для чего-то использовался, мог бы сэкономить некоторое время. –

Смежные вопросы