原因最大值,最小值和平均值的相同值是因为您只传递一个样本(即一个样本的最大值,最小值和平均值始终相同)。要获得平均值,您需要捕获许多样本(例如,只要过程“cmd”正在运行)。我会将这些信息存储在一个数组中,然后当我将数组传递给我的Measure-Object cmdlt时,它会给我正确的Max,Min,Average。
编辑第1部分:(改写纠正码)
这里是我的代码,如果你想:
- 启动一个cmd过程
- 日志的处理时间到一个数组。
- 注:处理时间以秒为单位,而且是累积的(即它不断累加)
- 我们必须做一些减法,以获得处理时间之间的“三角洲”或差异。此外,每秒采样(而不是每2秒)可以使我们的计算更容易。
- 我乘以10的增量来获得粗略%CPU值
- 一旦CMD处理结束时,其离开出while循环的。
- 然后,我们使用Measure-Object来获取数组,并计算最小值,最大值和平均值。
- 然后,我们将输出管道输送到一个文本文件(或者替代方法是将$数组传送给文本文件,您可以随时分析CPU)。
。
$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部分:
你原来的问题真是两个问题:
- 为什么[下文]脚本只返回平均CPU利用率? - 这个答案就是我上面的解释。
- 如何从一个特定/多个进程(特别是多个cmd.exe)获取最小,最大,平均CPU?
根据您的意见,我认为部分#2是你想要的......这需要更多的时间和解释。我可以给你一个你必须做的基本概述。
如果您使用上述脚本,则可以控制何时启动脚本并可以精确测量CPU。如果cmd.exe已经在运行,那么你不能得到准确的数字(例如,如果该进程已经运行了10个小时,你将得到该进程已经使用的CPU时间的总秒数。你不能容易地获得得到最小和最大CPU,但使用StartTime属性,可以获得平均值)。
我看到了两种方法来得到你想要的东西:
- “包装”任何过程中,你用PowerShell脚本启动。即采取上述脚本,并使用它来启动cmd进程。通过这种方式,每个PowerShell脚本都可以控制一个正在记录和测量的cmd进程,并且会为您提供良好的数据。
- 对于当前正在运行的进程,你将不得不使用一个这样的脚本:
。
$cmdProcess = Get-Process cmd
$cmdProcess | foreach{
$avg = $_.CPU/([datetime]::Now - [datetime]$_.StartTime).TotalSeconds
Write-Host "PID: $($_.Id) CPU: $($_.CPU) Average: $avg"
}
这是你的所有“CMD”进程,通过每个过程循环,计算平均CPU利用率基础上,已经运行了多长时间,并显示结果(这可以被发送到一个文件或任何地方)。然后,您可以将其用作另一个更大的循环的一部分,该循环运行并记录所有进程的CPU时间(类似于第一个脚本)。一个完整的更大的最终脚本将超出这个问题的范围,你将不得不做更多的研究来完成它,但这应该给你一个好的开始。
你是否想要超过一组时间的平均值? –
@Kevin_是的,假设我打开'命令提示符(cmd.exe)'并运行一些命令。在此期间,我希望通过'cmd.exe'获得CPU使用率(max,avg)的统计信息,直到退出cmd.exe。我已经安装了Powershell。只有我必须运行必要的脚本并将结果保存在文本文件中。 –