我正在尝试在 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`
}}}}}}
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
{
"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}"
}
]
}
Run Code Online (Sandbox Code Playgroud)
问题是 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}
}
Run Code Online (Sandbox Code Playgroud)
您的代码目前有 3 个问题。
首先,您ConvertTo-Json(至少)调用两次 - 一次在内部 Partition 哈希表上,然后在外部哈希表上再次调用。
其次,您没有指定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
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以上将为磁盘生成n离散的 JSON 结构n。
移动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
}
}
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5372 次 |
| 最近记录: |