Powershell:为JSON构建要输出的多级PSObject

Powershell:为JSON构建要输出的多级PSObject,powershell,Powershell,我有一个PS1,它可以收集关于一台计算机的多个信息位。有几个步骤在数组中循环,我需要向PSObject添加元素。每次尝试都会失败(创建新的PSObject并添加到PSObject;创建多维数组并添加到PSObject;尝试构建哈希并添加到PSObject) 我得到了$drives $drives = gwmi Win32_LogicalDisk | Where-Object {$_.DriveType -eq 4} 并且生成的PSObject | converttojson应该是 {

我有一个PS1,它可以收集关于一台计算机的多个信息位。有几个步骤在数组中循环,我需要向
PSObject
添加元素。每次尝试都会失败(创建新的
PSObject
并添加到
PSObject
;创建多维数组并添加到
PSObject
;尝试构建哈希并添加到
PSObject

我得到了
$drives

$drives = gwmi Win32_LogicalDisk | Where-Object {$_.DriveType -eq 4}
并且生成的
PSObject | converttojson
应该是

 {
   "metrics":{
     "run": worksfine
     "cpu": worksfine
     "memory": worksfine
   },
   "disks":[
     {
       "drive": I_have_Info; CannotPopulateCorrectly,
       "freeSpace": I_have_Info; CannotPopulateCorrectly
     },
     {
       "drive": I_have_Info; CannotPopulateCorrectly,
       "freeSpace" I_have_Info; CannotPopulateCorrectly
     }
   ]
 }
欢迎所有建议

编辑

cls
$output = New-Object PSObject

### METRICS ###
$metrics = New-Object PSObject
# Current time date
$lastRun = Get-Date -Format "HH:mm MM/dd/yyyy"
$metrics | Add-Member -PassThru NoteProperty lastRun $lastRun

# Get Avg CPU
$cpu = (gwmi win32_processor | Measure-Object -property LoadPercentage -Average).Average
$metrics | Add-Member -PassThru NoteProperty cpu $cpu

# Get Available Memory
$memory = (Get-Counter -counter "\Memory\Available MBytes").CounterSamples | Select-Object -expandProperty CookedValue

# Get Total Memory
$totalMem = ((gwmi CIM_PhysicalMemory).Capacity)[0] / 1048576

# Percent free Memory
$freeMemory = [math]::round($memory / $totalMem, 2) * 100
$metrics | Add-Member -PassThru NoteProperty memory $freeMemory

$output | Add-Member -PassThru NoteProperty metrics $metrics
### END METRICS ###
### DISKS ###
# Get Disk Drives
$drives = gwmi Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}
$disks = ## What should this be? ##
foreach($drive in $drives)
{
    $id = $drive.DeviceID
    $size = [math]::round($drive.Size / 1073741824, 2)
    $free = [math]::round($drive.FreeSpace  / 1073741824, 2)
    $pct = [math]::round($free / $size, 2) * 100 #SHOW IN JSON
    $disks ## Add drive = $id, freeSpace = $pct - How? ##

## Not able to build a correct element here to add for JSON ##
}
$output | Add-Member -PassThru NoteProperty disks ##??$disks??#
### END DISKS ###

像这样的东西可能有用

$info = [pscustomobject]@{
    metrics = [pscustomobject]@{
        run = 'worksfine'
        cpu = 'worksfine'
        memory = 'worksfine'
    }
}

$drives = gwmi Win32_LogicalDisk | Where-Object {$_.DriveType -eq 4} | select @{n='drive';e={$_.deviceid}}, freespace

$info | Add-Member -MemberType NoteProperty -Name disks -Value $drives

$info | ConvertTo-Json
输出

{
    "metrics":  {
                    "run":  "worksfine",
                    "cpu":  "worksfine",
                    "memory":  "worksfine"
                },
    "disks":  [
                  {
                      "drive":  "C:",
                      "freespace":  18163093504
                  },
                  {
                      "drive":  "D:",
                      "freespace":  57510354944
                  }
              ]
}

我发现pscustomobject的使用在很大程度上是不需要的。不确定这是否仅在更高版本的powershell中可用,但此语法工作正常

$driveinfo = @{
   "metrics"= @{
     "run" = "worksfine"
     "cpu" = "worksfine"
     "memory" = "worksfine"
   }   
   "disks" = @(
     @{
       "drive" = "c"
       "freeSpace" = 12442
     }
     @{
       "drive" = "d"
       "freeSpace"  = 3214124
     }
   )
}

$driveinfo | ConvertTo-JSON

你能展示你剩下的代码吗?我们需要你剩下的代码来看看这里发生了什么。为了进行比较,当我运行GWMI win32_LogicalDisk | Convertto Json时,我得到了完全有效的输出。因此初始对象必须是pscustomobject,而不是“标准”PSObject?不,标准PSObject是可以的,但当使用类型加速器时,您使用的是
[pscustomobject]
在使用
新对象时
可以执行此操作
新对象psobject-properties@{…}