通过Powershell进行内存和CPU监控

通过Powershell进行内存和CPU监控,powershell,memory,cpu,monitoring,Powershell,Memory,Cpu,Monitoring,我正在尝试使用powershell监视特定进程的cpu和内存使用情况。我们的想法是安排它,让它在特定的时间间隔获得值,然后将它们输出到.csv 到目前为止,我遇到了两个案例: 该进程只有一个进程ID。 代码运行良好。 该进程有几个具有自己ID的子进程。 我希望它在最终输出中添加值。我对每个子流程的单个值不感兴趣,例如每个chrome选项卡,但对所有子流程的累积值感兴趣。 这是所需的输出:如果流程有子流程,则计数应反映该输出 Enter the name of the process to mon

我正在尝试使用powershell监视特定进程的cpu和内存使用情况。我们的想法是安排它,让它在特定的时间间隔获得值,然后将它们输出到.csv

到目前为止,我遇到了两个案例:

该进程只有一个进程ID。 代码运行良好。 该进程有几个具有自己ID的子进程。 我希望它在最终输出中添加值。我对每个子流程的单个值不感兴趣,例如每个chrome选项卡,但对所有子流程的累积值感兴趣。 这是所需的输出:如果流程有子流程,则计数应反映该输出

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
#>