我对Powershell很新。我正在尝试在特定进程运行时获得CPU最大值和平均利用率。我使用的是以下脚本,但我当时只获得了平均CPU利用率。
Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average | Select Average
请帮助我使用的示例脚本“如何在特定进程运行时每2秒获得CPU最大值和平均利用率,并将结果数据存储在文本文件中” ....
答案 0 :(得分:0)
如果要每2秒进行一次采样,并在cmd.exe运行的整个时间段内显示max,min,ave,则以下代码将起作用。但是如果你想每2秒对数据进行一次采样并显示2秒间隔的最大值,最小值,平均值,则所有3个都是相同的(因为在该间隔期间你只有1个样本)。您必须更频繁地采样(例如每0.2秒),然后在每两秒间隔后重置$ stats数组。下面的代码不是为此而设计的。
$cmdProcess = start-process cmd -passthru
$delay = 2
$stats = @()
$previous = ($cmdProcess|Get-Process).cpu
while (-not $cmdProcess.HasExited) {
$latest = $cmdProcess|Get-Process
$delta = $latest.cpu - $previous
$delta
$stats += $delta
$previous = $latest.CPU
sleep $delay
}
$stats|% {$_/$delay}|measure -max -min -ave
**更新7/8修复bug - 收集进程使用的总时间(vs delta超过2秒间隔)**
答案 1 :(得分:0)
Measure-Object命令为Max,Min和Average提供相同值的原因是因为您只传递一个样本(即一个样本的Max,Min和Average始终相同) )。
要获得平均值,您需要捕获许多样本(例如,只要进程“cmd”正在运行)。我将该信息存储在一个数组中,然后当我将数组传递给我的Measure-Object cmdlt时,它会给我正确的Max,Min,Average。
编辑第1部分:(重写以更正代码)
如果你想:
,这是我的代码
$cmdProcess = start-process cmd -passthru
$array = @()
$LastCPU = $CmdProcess.CPU * 10
while(-not $cmdProcess.HasExited)
{
$CurrentCPU = $CmdProcess.CPU*10
$array += $CurrentCPU - $LastCPU
$LastCPU = $CurrentCPU
sleep 1
}
$array | Measure-Object -Average -Maximum -Minimum | Out-File c:\Output.txt
编辑第2部分:
你原来的问题实际上是两个问题:
根据你的评论,我认为第2部分是你想要的...这需要更多的时间和解释。我可以给你一个基本的概述,你将要做什么。
如果使用上述脚本,则可以控制何时启动脚本并可以准确测量CPU。如果cmd.exe已在运行,那么您无法获得准确的数字(即,如果该进程已运行10个小时,您将获得该进程使用的CPU时间的总秒数。您不能轻易地 从中获取最小和最大CPU,但使用StartTime属性,您可以获得平均值。)
我看到两种方法可以得到你想要的东西:
$cmdProcess = Get-Process cmd
$cmdProcess | foreach{
$avg = $_.CPU / ([datetime]::Now - [datetime]$_.StartTime).TotalSeconds
Write-Host "PID: $($_.Id) CPU: $($_.CPU) Average: $avg"
}
这是获取所有“cmd”进程的地方,遍历每个进程,根据运行时间计算平均CPU利用率,并显示结果(可以发送到文件或任何地方)。然后,您可以将其用作另一个运行的较大循环的一部分,并记录所有进程的CPU时间(类似于第一个脚本)。一个完整的更大的最终剧本将超出这个问题的范围,你将不得不自己做更多的研究来完成它,但这应该给你一个良好的开端。