I have a script that I have built a psobject from either properties or calculations from 3 other collections.
psObj4 has 6 property/values from psObj1, 3 property/values calculated from using psObj2 and psObj3.
I want to get a specific number of property/values from psObj4 into psObj5 that match specific criteria.
When I built psObj4, I was using psObj1 that was a sorted by property [Id] so psObj4 is sorted by the same value. I would like to re-sort psObj4 by one of the calculated property/values, then get the top 15.
Script
Function Initialize {
#Processor Information
Write-Host "Getting Processor Info"
$script:processor = Get-CimInstance Win32_Processor
$script:lp = $processor.NumberOfLogicalProcessors
$script:cores = $processor.NumberOfCores
#Operating System Information
Write-Host "Getting Operating System Info"
$script:os = Get-CimInstance Win32_OperatingSystem
#Logical Disk Information
Write-Host "Getting Logical Disk Info"
$script:disk = Get-CimInstance Win32_LogicalDisk
#Computer System
Write-Host "Getting Computer System Info"
$script:cs = Get-CimInstance Win32_ComputerSystem
#System Enclosure
Write-Host "Getting System Enclosure Info"
$script:enc = Get-CimInstance Win32_SystemEnclosure | Select SMBIOSAssetTag,Caption,$ChassisTypes
#System BIOS
Write-Host "Getting BIOS Info"
$script:bios = Get-CimInstance Win32_Bios
#System Physical Memory
Write-Host "Getting Physical Memory Info"
$script:memory = Get-CimInstance Win32_PhysicalMemory
#Disk Partition Information
Write-Host "Getting Disk Partition Info"
$script:dpd = Get-Disk
$script:dpp = Get-Partition
$script:dpv = Get-Volume
#Networking Information
Write-Host "Getting Network Adapter Info"
$script:adapters = Get-NetAdapter
$script:interfaces = Get-CimInstance CIM_NetworkAdapter
$script:nrv4 = Get-NetRoute -AddressFamily IPv4
$script:nrv6 = Get-NetRoute -AddressFamily IPv6
#Network Statistics
Write-Host "Getting Network Statistics Info"
netstat -s > C:\Diags\netstat.txt
$script:netappstats = Get-NetAdapterStatistics
#Services Information
Write-Host "Getting Services Info"
$script:services = Get-CimInstance Win32_Service
#Process Information
Write-Host "Getting Process Info"
$script:processes = Get-CimInstance Win32_Process | Select -Property * | Sort ProcessId
$script:csprocs = (Get-Counter "\Process(*)\ID Process" -ErrorAction SilentlyContinue).CounterSamples
$script:cscpu = (Get-Counter "\Process(*)\% Processor Time" -ErrorAction SilentlyContinue).CounterSamples
#Service Processes
Write-Host "Getting Processor Info"
$script:svcprocs = @{([int]-1) = "-1"}
foreach ($s in $services) {
if ($s.State -eq "Running") {
if ($svcprocs[([int]$s.ProcessId)] -eq $null) {
$svcprocs += @{([int]$s.ProcessId) = $s.Name }
} else {
$svcprocs[([int]$s.ProcessId)] += ("/" + $s.Name)
}
}
}
$script:localdatetime = $os.LocalDateTime
$script:uptime = (Get-Date) - ($os.LastBootUpTime)
}
Function DiagProcesses {
$rptProcs=@()
foreach ($p in $processes) {
$prpProc=$null
$id = $p.ProcessId
if ($svcprocs[($id)] -ne $null) {
$procName = "SVC:" + $svcprocs[($p.Id)]
} else {
$procName = $p.Name
}
$ppath = ($csprocs | Where RawValue -eq $p.id) | Select -ExpandProperty Path
$ppath = $ppath -replace "\\id process$","\% Processor Time"
$cv = ($cscpu | Where Path -eq $ppath).CookedValue
$pctcpu = [Decimal]::Round(($cv/$lp),2)
$pws = "{0}/{1}" -f ($p.WorkingSetSize / 1KB), ($p.PeakWorkingSetSize)
$pvmem = "{0}/{1}" -f ($p.VirtualSize / 1KB), ($p.PeakVirtualSize / 1KB)
$ppgmem = "{0}/{1}" -f ($p.PageFileUsage), ($p.PeakPageFileUsage)
If ($ppgmem -eq "/") { $ppgmem = "-" }
#$pnpgmem = "{0}" -f ($p.PrivatePageCount / 1KB)
$procdata = [pscustomobject]@{
Id = ($p.ProcessId)
Name = ($procname)
'Handle Count' = ($p.HandleCount)
CPU = ($pctcpu)
WS = ($pws)
VM = ($pvmem)
PM = ($ppgmem)
SI = ($p.SessionId)
CommandLine = ($p.CommandLine)
}
$script:rptProcs += $procdata
}
}
function ClientCPU {
$usersessions = qwinsta /counter
$infocpu = [psCustomObject]@{
Name = $processor.Name
Description = $processor.Description
Cores = $processor.NumberOfCores
'Logical Processors' = $processor.NumberOfLogicalProcessors
}
$statcpu = [psCustomObject]@{
Uptime = $uptime.Days
Users = ($usersessions -match 'Active').Length
Processes = $processes.Count
Load = $processor.LoadPercentage
}
$ptotal = $cscpu | Where Path -Match '(_total)'
$pidle = $cscpu | Where Path -Match '(idle)'
$cvcpu = ($cscpu | Where Path -eq $ptotal).CookedValue
$cvid = ($cscpu | Where Path -eq $pidle).CookedValue
$pctTotal = [Decimal]::Round(($cv/$lp),2)
$pctIdle = [Decimal]::Round(($cv/$lp),2)
$state = [psCustomObject]@{
'_Total' = $pctTotal
Idle = $pctIdle
}
$tpProcs = $rptProcs | Where CPU -gt 0 | Sort CPU | Select -First 15
$tpProcs
}
Initialize
DiagProcesses
ClientCPU - At this point $psObj5 contains nothing
I have tried:
- Creating psObj4 as a blank Object with
$script:psObj4=@()
- Creating psObj4 as a blank Object with
$global:psObj4=@()
- returning $psObj4 from Function1 (seems to display $psObj4 but I don’t want it to)
- $psObj4 = Function1
If I do: $psObj4 | ft -a at the end of function2, it shows all the data that I want.
I just can’t seem to figure out how/why when I use $psObt4 in Function3, I get no data.
Edited as requested.