我有一台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