Причина, по которой команда Measure-Object дает вам то же значение для Max, Min и Average означает, что вы передаете только один образец (т. е. Max, Min и Average одного образца всегда одинаковы).
Чтобы получить среднее значение, вам нужно захватить множество выборок (например, до тех пор, пока выполняется процесс «cmd»). Я бы сохранил эту информацию в массиве, а затем, когда я передаю массив в свой cmdlt Measure-Object, он даст мне правильный Max, Min, Average.
Edit Part 1: (переписаны, чтобы исправить код)
Вот мой код, если вы хотите:
- Launch ЦМД процесс
- Войдите время обработки в массив ,
- Примечания: Время обработки в секундах, и кумулятивная (т.е. он продолжает добавлять вверх)
- Мы должны сделать некоторое вычитание, чтобы получить «дельту» или разницу между временем обработки. Кроме того, выборка каждую секунду (а не каждые 2 секунды) облегчает наши вычисления.
- я умножить дельту на 10, чтобы получить приблизительное% Значения CPU
- После того, как CMD процесс заканчивается, он выходит из цикла.
- Затем мы используем объект Measure-Object для вычисления массива и вычисляем значения min, max и avg.
- Затем мы выводим вывод в текстовый файл (или альтернативой было бы передать массив $ массив текстовый файл, где вы могли бы анализировать процессор с течением времени).
.
$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
EDIT Часть 2:
Ваш оригинальный вопрос был действительно два вопроса:
- Почему же [ниже] скрипт возвращает только среднюю загрузку процессора? - Ответ на это - мое объяснение выше.
- Как получить Min, max, avg CPU из определенного/множественного процесса (в частности, несколько cmd.exe)?
Основываясь на ваших комментариях, я предполагаю, что часть № 2 - это то, что вы хотите ... Это требует больше времени и объяснений. Я могу дать вам общий обзор того, что вам нужно будет сделать.
Если вы использовали приведенный выше сценарий, вы управляете при запуске скрипта и можете получить точное измерение CPU. Если cmd.exe уже запущен, то вы не можете получить точные цифры (т. Е. Если процесс работает в течение 10 часов, вы получаете общее количество секунд времени процессора, которое этот процесс использовал. Вы не можете легко получить min и max CPU, но используя свойство StartTime, вы можете получить среднее значение).
Я вижу два способа, чтобы получить то, что вы хотите:
- «Wrap» любой процесс, который вы запускаете с помощью сценария 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"
}
Это где вы получите все «ЦМД» процессы, цикл по каждому процессу, вычислить среднюю загрузку процессора на основе того, как долго он был запущен, и отображать результаты (которые могут быть отправлены в файл или где бы то ни было). Затем вы можете использовать это как часть другого более крупного цикла, который запускает и регистрирует времена процессора для всех процессов (аналогично первому сценарию). Полный более крупный окончательный сценарий выходит за рамки этого вопроса, и вам нужно будет сделать еще несколько исследований для его завершения, но это должно дать вам хорошее начало.
Вы хотите, чтобы среднее значение превышало заданное количество времени? –
@Kevin_ Да, предположим, что я открываю 'Command Prompt (cmd.exe)' и запускаю некоторые команды. В течение этого времени я хочу получить статистику использования CPU (max, avg) с помощью 'cmd.exe' до выхода' cmd.exe'. У меня уже установлена Powershell. Только мне нужно запустить необходимые сценарии и сохранить результаты в текстовом файле. –