Powershell:构建多级PSObject输出JSON



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

我得到$drives

$drives = gwmi Win32_LogicalDisk | Where-Object {$_.DriveType -eq 4}

结果PSObject | ConvertTo-JSON应该是

 {
   "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 "MemoryAvailable 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

最新更新