2016-05-07 39 views
1

PowerShellでJSONオブジェクトを作成しようとしているので、Pythonスクリプトで使用できます。 私が持っていた混合の結果は、私はちょうど私のPythonスクリプトから実行できるように1つのコマンドに組み込むこれを圧縮しようとしている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(少なくとも)を2回呼び出します。内側のパーティションハッシュテーブルで1回、外側のハッシュテーブルでもう一度呼び出します。

第2に、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 
      } 
     } 
     } 
    } 
    } 
}) 
+0

トリックをしてくれてありがとう、私は深さがどのようなものに使われたのか分からず、ある程度時間を節約できました。 –

関連する問題