通过Powershell进行内存和CPU监控
我正在尝试使用powershell监视特定进程的cpu和内存使用情况。我们的想法是安排它,让它在特定的时间间隔获得值,然后将它们输出到.csv 到目前为止,我遇到了两个案例: 该进程只有一个进程ID。 代码运行良好。 该进程有几个具有自己ID的子进程。 我希望它在最终输出中添加值。我对每个子流程的单个值不感兴趣,例如每个chrome选项卡,但对所有子流程的累积值感兴趣。 这是所需的输出:如果流程有子流程,则计数应反映该输出通过Powershell进行内存和CPU监控,powershell,memory,cpu,monitoring,Powershell,Memory,Cpu,Monitoring,我正在尝试使用powershell监视特定进程的cpu和内存使用情况。我们的想法是安排它,让它在特定的时间间隔获得值,然后将它们输出到.csv 到目前为止,我遇到了两个案例: 该进程只有一个进程ID。 代码运行良好。 该进程有几个具有自己ID的子进程。 我希望它在最终输出中添加值。我对每个子流程的单个值不感兴趣,例如每个chrome选项卡,但对所有子流程的累积值感兴趣。 这是所需的输出:如果流程有子流程,则计数应反映该输出 Enter the name of the process to mon
Enter the name of the process to monitor: xmrig
21048
------SAMPLES------
TimeStamp : 2021-04-11 22:32:09
InstanceName : xmrig
CookedValue : 2289,4108563869
Count : 1
Sum : 15671296
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
2021-04-11 22:32:09 xmrig 95,39 1 14,95
他的密码是:
clear
$ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
#Write-host $ProcessName
try{
$ProcessId = Get-Process $ProcessName -ErrorAction Stop | select -expand id
}
catch
{
write-host ("No such process found, try again.") -ForegroundColor Red
$ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
}
$AllProcessIds = Get-Process $ProcessName | select -expand id
Write-Host ""
#Write-Output ("Process "+ $ProcessName + " has ID: "+ $ProcessId )
$CpuCores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors
$CPUSamples =@()
$MEMSamples =@()
foreach ($ProcessId in $AllProcessIds){
Write-Host $ProcessId -ForegroundColor red
$CPUSamples += (Get-Counter "\Process($ProcessName*)\% Processor Time").CounterSamples | Select-Object *
$MEMSamples += Get-Process $ProcessName | Measure-Object Workingset -sum -average
}
<# Write-Host "------MEM SAMPLES------"
$MEMSamples
Write-Host "------CPU SAMPLES------"
$CPUSamples #>
$Samples = New-object psobject;
$Samples | Add-Member NoteProperty "TimeStamp" $CPUSamples.Timestamp;
$Samples | Add-Member NoteProperty "InstanceName" $CPUSamples.InstanceName;
$Samples | Add-Member NoteProperty "CookedValue" $CPUSamples.CookedValue;
$Samples | Add-Member NoteProperty "Count" $MEMSamples.Count;
$Samples | Add-Member NoteProperty "Sum" $MEMSamples.Sum;
Write-Host "------SAMPLES------"
$Samples
$Samples.CookedValue | ForEach-object -begin {$CookedValueSum =0} -process {$CookedValueSum+=$_} -end{}
#$Samples| Select-Object TimeStamp, InstanceName, @{Name="CPU %";Expression={[Decimal]::Round(($_.CookedValue / $CpuCores), 2)}},Count, @{Name="SumMB";Expression = {[math]::round($_.Sum/1MB,2)}} | Format-Table -AutoSize
$Samples| Select-Object TimeStamp, InstanceName, @{Name="CPU %";Expression={[Decimal]::Round(($_.CookedValueSum / $CpuCores), 2)}},Count, @{Name="SumMB";Expression = {[math]::round($_.Sum/1MB,2)}} | Format-Table -AutoSize
有没有办法解决这个问题?有没有更简单的方法,或者我把事情复杂化了?
非常感谢您的帮助 看了你的帖子,我不知道你有什么问题。你想达到这样的目标吗
$Name = "svchost"
$processes = Get-Process $Name
$cpu_cores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors
[PSCustomObject]@{
Timestamp = (Get-Date)
InstanceName = $Name
Count = $processes.Count
Memory = ($Processes.WorkingSet | Measure-Object -Sum).Sum
CPU = "$([Math]::Round(($processes.cpu | Measure-Object -Sum).Sum / $cpu_cores, 2))%"
} | ft
这个轻微的重构怎么样
Clear-Host
$ProcessName = 'idle'
try
{
$ProcessId = Get-Process $ProcessName -ErrorAction Stop |
Select-Object -ExpandProperty id
}
catch
{
write-host ("No such process found, try again.") -ForegroundColor Red
$ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
}
$AllProcessIds = Get-Process $ProcessName |
Select-Object -ExcludeProperty id
$CpuCores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors
$CPUSamples = @()
$MEMSamples = @()
foreach ($ProcessId in $AllProcessIds)
{
$CPUSamples += (Get-Counter "\Process($ProcessName*)\% Processor Time").CounterSamples |
Select-Object -Property '*'
$MEMSamples += Get-Process $ProcessName |
Measure-Object Workingset -sum -average
}
$Samples = New-object psobject
$Samples |
Add-Member NoteProperty 'TimeStamp' $($CPUSamples.Timestamp |
Select-Object -First 1)
$Samples |
Add-Member NoteProperty 'InstanceName' ($CPUSamples.InstanceName |
Select-Object -Unique)
$Samples |
Add-Member NoteProperty 'CookedValue' $($CPUSamples.CookedValue |
Measure-Object -Sum).Sum
$Samples |
Add-Member NoteProperty 'Count' $MEMSamples.Count
$Samples |
Add-Member NoteProperty 'Sum' $($MEMSamples.Sum |
Measure-Object -Sum).Sum
Write-Host '------SAMPLES------'
$Samples
$Samples.CookedValue |
ForEach-object -begin {$CookedValueSum =0} -process {$CookedValueSum+=$_} -end{}
$Samples |
Select-Object TimeStamp,
InstanceName,
@{
Name = 'CPU %'
Expression = {[Decimal]::Round(($_.CookedValueSum / $CpuCores), 2)}
},
Count,
@{
Name = 'SumMB'
Expression = {[math]::round($_.Sum/1MB,2)}
} |
Format-Table -AutoSize
# Results
<#
------SAMPLES------
TimeStamp : 4/11/2021 8:00:35 PM
InstanceName : explorer
CookedValue : 0
Count : 1
Sum : 167120896
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:00:35 PM explorer 0 1 159.38
------SAMPLES------
TimeStamp : 4/11/2021 8:01:05 PM
InstanceName : runtimebroker
CookedValue : 0
Count : 3
Sum : 262680576
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:01:05 PM runtimebroker 0 3 250.51
------SAMPLES------
TimeStamp : 4/11/2021 8:01:26 PM
InstanceName : svchost
CookedValue : 0
Count : 25
Sum : 14374760448
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:01:26 PM svchost 0 25 13708.84
------SAMPLES------
TimeStamp : 4/11/2021 8:02:10 PM
InstanceName : idle
CookedValue : 798.371953662604
Count : 1
Sum : 8192
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:02:10 PM idle 0 1 0.01
#>
确切地所以我把事情复杂化了。。。谢谢不客气。如果没有其他问题,请将其标记为解决方案。
Clear-Host
$ProcessName = 'idle'
try
{
$ProcessId = Get-Process $ProcessName -ErrorAction Stop |
Select-Object -ExpandProperty id
}
catch
{
write-host ("No such process found, try again.") -ForegroundColor Red
$ProcessName = Read-Host -Prompt 'Enter the name of the process to monitor'
}
$AllProcessIds = Get-Process $ProcessName |
Select-Object -ExcludeProperty id
$CpuCores = (Get-WMIObject Win32_ComputerSystem).NumberOfLogicalProcessors
$CPUSamples = @()
$MEMSamples = @()
foreach ($ProcessId in $AllProcessIds)
{
$CPUSamples += (Get-Counter "\Process($ProcessName*)\% Processor Time").CounterSamples |
Select-Object -Property '*'
$MEMSamples += Get-Process $ProcessName |
Measure-Object Workingset -sum -average
}
$Samples = New-object psobject
$Samples |
Add-Member NoteProperty 'TimeStamp' $($CPUSamples.Timestamp |
Select-Object -First 1)
$Samples |
Add-Member NoteProperty 'InstanceName' ($CPUSamples.InstanceName |
Select-Object -Unique)
$Samples |
Add-Member NoteProperty 'CookedValue' $($CPUSamples.CookedValue |
Measure-Object -Sum).Sum
$Samples |
Add-Member NoteProperty 'Count' $MEMSamples.Count
$Samples |
Add-Member NoteProperty 'Sum' $($MEMSamples.Sum |
Measure-Object -Sum).Sum
Write-Host '------SAMPLES------'
$Samples
$Samples.CookedValue |
ForEach-object -begin {$CookedValueSum =0} -process {$CookedValueSum+=$_} -end{}
$Samples |
Select-Object TimeStamp,
InstanceName,
@{
Name = 'CPU %'
Expression = {[Decimal]::Round(($_.CookedValueSum / $CpuCores), 2)}
},
Count,
@{
Name = 'SumMB'
Expression = {[math]::round($_.Sum/1MB,2)}
} |
Format-Table -AutoSize
# Results
<#
------SAMPLES------
TimeStamp : 4/11/2021 8:00:35 PM
InstanceName : explorer
CookedValue : 0
Count : 1
Sum : 167120896
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:00:35 PM explorer 0 1 159.38
------SAMPLES------
TimeStamp : 4/11/2021 8:01:05 PM
InstanceName : runtimebroker
CookedValue : 0
Count : 3
Sum : 262680576
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:01:05 PM runtimebroker 0 3 250.51
------SAMPLES------
TimeStamp : 4/11/2021 8:01:26 PM
InstanceName : svchost
CookedValue : 0
Count : 25
Sum : 14374760448
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:01:26 PM svchost 0 25 13708.84
------SAMPLES------
TimeStamp : 4/11/2021 8:02:10 PM
InstanceName : idle
CookedValue : 798.371953662604
Count : 1
Sum : 8192
TimeStamp InstanceName CPU % Count SumMB
--------- ------------ ----- ----- -----
4/11/2021 8:02:10 PM idle 0 1 0.01
#>