2013-07-05 82 views
0

我对Powershell非常陌生。我正在尝试在某个特定进程正在运行时获得CPU最大值和平均利用率。我正在使用下面的脚本,但那时我只能获得平均CPU利用率。PowerShell - 如何执行脚本并将结果保存在文本文件中

Get-WmiObject win32_processor | Measure-Object -property LoadPercentage -Average | Select Average 

请帮我的示例脚本为“我怎样才能得到最大的CPU平均利用率为每2秒为一个特定的进程正在运行,存储在文本文件中的结果数据” ....

+0

你是否想要超过一组时间的平均值? –

+0

@Kevin_是的,假设我打开'命令提示符(cmd.exe)'并运行一些命令。在此期间,我希望通过'cmd.exe'获得CPU使用率(max,avg)的统计信息,直到退出cmd.exe。我已经安装了Powershell。只有我必须运行必要的脚本并将结果保存在文本文件中。 –

回答

0

如果您想每隔2秒采样一次,并在cmd.exe运行的整个时间段内显示max,min,ave,则下面的代码将工作。但是,如果您想每两秒钟对数据进行一次采样,并显示该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修复错误 - 被收集,该测量 - 对象命令是给你的(超过2秒的时间间隔VS增量)使用过程总时间**

+0

感谢您的回答..我会在明天检查并让您知道... –

+0

我是否正在获取CPU利用率的最大值,最小值,平均CPU利用率或最大百分比,最小百分比,平均百分比? –

+0

请参阅我的问题在'服务器错误'以及... http://serverfault.com/questions/521571/powershell-how-to-get-memory-max-avg-usage-page-fault-max-avg -usage- –

0

原因最大值,最小值和平均值的相同值是因为您只传递一个样本(即一个样本的最大值,最小值和平均值始终相同)。要获得平均值,您需要捕获许多样本(例如,只要过程“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部分:

你原来的问题真是两个问题:

  1. 为什么[下文]脚本只返回平均CPU利用率? - 这个答案就是我上面的解释。
  2. 如何从一个特定/多个进程(特别是多个cmd.exe)获取最小,最大,平均CPU?

根据您的意见,我认为部分#2是你想要的......这需要更多的时间和解释。我可以给你一个你必须做的基本概述。

如果您使用上述脚本,则可以控制何时启动脚本并可以精确测量CPU。如果cmd.exe已经在运行,那么你不能得到准确的数字(例如,如果该进程已经运行了10个小时,你将得到该进程已经使用的CPU时间的总秒数。你不能容易地获得得到最小和最大CPU,但使用StartTime属性,可以获得平均值)。

我看到了两种方法来得到你想要的东西:

  1. “包装”任何过程中,你用PowerShell脚本启动。即采取上述脚本,并使用它来启动cmd进程。通过这种方式,每个PowerShell脚本都可以控制一个正在记录和测量的cmd进程,并且会为您提供良好的数据。
  2. 对于当前正在运行的进程,你将不得不使用一个这样的脚本:

$cmdProcess = Get-Process cmd 
$cmdProcess | foreach{ 
    $avg = $_.CPU/([datetime]::Now - [datetime]$_.StartTime).TotalSeconds 
    Write-Host "PID: $($_.Id) CPU: $($_.CPU) Average: $avg" 
} 

这是你的所有“CMD”进程,通过每个过程循环,计算平均CPU利用率基础上,已经运行了多长时间,并显示结果(这可以被发送到一个文件或任何地方)。然后,您可以将其用作另一个更大的循环的一部分,该循环运行并记录所有进程的CPU时间(类似于第一个脚本)。一个完整的更大的最终脚本将超出这个问题的范围,你将不得不做更多的研究来完成它,但这应该给你一个好的开始。

+0

谢谢你的回答..我会检查并让你明天知道... –

+0

一些评论。如果打开多个cmd提示,'get-process cmd'将不会检测到特定cmd提示符的终止。而win32_processor提供整体CPU利用率,而不是cmd对CPU的使用。尽管来自OP,但并不清楚需要什么。 –

+0

@ user2460798是的,实际上我会打开多个命令提示符,并分别获取每个命令提示符的CPU利用率并将结果存储在文本文件中 –

相关问题