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