2013-07-05 3 views
0

Я очень новичок в Powershell. Я пытаюсь получить максимальную и среднюю загрузку процессора, пока выполняется определенный процесс. Я использую скрипт ниже, но в этот момент я получаю только среднюю загрузку процессора.PowerShell - как выполнить скрипт и сохранить результаты в текстовом файле

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

Пожалуйста, помогите мне с образцом сценария для «как я могу получить максимальную производительность процессора и средней загрузки на каждые 2 секунды для конкретного процесса запуска и сохранения данных результата в текстовый файл» ....

+0

Вы хотите, чтобы среднее значение превышало заданное количество времени? –

+0

@Kevin_ Да, предположим, что я открываю 'Command Prompt (cmd.exe)' и запускаю некоторые команды. В течение этого времени я хочу получить статистику использования CPU (max, avg) с помощью 'cmd.exe' до выхода' cmd.exe'. У меня уже установлена ​​Powershell. Только мне нужно запустить необходимые сценарии и сохранить результаты в текстовом файле. –

ответ

0

Если вы хотите пробовать каждые 2 секунды и показывать max, min, ave в течение всего периода работы 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-секундного интервала) **

+0

Спасибо, что ответили .. Я проверю и дам вам знать завтра ... –

+0

Я получаю Max, Min, Avg CPU usage или Max%, Min%, Avg% от использования процессора? –

+0

См. Мой вопрос в 'server fault', а также ... http: //serverfault.com/questions/521571/powershell-how-to-get-memory-max-avg-usage-page-fault-max-avg -usage-and –

0

Причина, по которой команда 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:

Ваш оригинальный вопрос был действительно два вопроса:

  1. Почему же [ниже] скрипт возвращает только среднюю загрузку процессора? - Ответ на это - мое объяснение выше.
  2. Как получить Min, max, avg CPU из определенного/множественного процесса (в частности, несколько cmd.exe)?

Основываясь на ваших комментариях, я предполагаю, что часть № 2 - это то, что вы хотите ... Это требует больше времени и объяснений. Я могу дать вам общий обзор того, что вам нужно будет сделать.

Если вы использовали приведенный выше сценарий, вы управляете при запуске скрипта и можете получить точное измерение CPU. Если cmd.exe уже запущен, то вы не можете получить точные цифры (т. Е. Если процесс работает в течение 10 часов, вы получаете общее количество секунд времени процессора, которое этот процесс использовал. Вы не можете легко получить min и max CPU, но используя свойство StartTime, вы можете получить среднее значение).

Я вижу два способа, чтобы получить то, что вы хотите:

  1. «Wrap» любой процесс, который вы запускаете с помощью сценария 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" 
} 

Это где вы получите все «ЦМД» процессы, цикл по каждому процессу, вычислить среднюю загрузку процессора на основе того, как долго он был запущен, и отображать результаты (которые могут быть отправлены в файл или где бы то ни было). Затем вы можете использовать это как часть другого более крупного цикла, который запускает и регистрирует времена процессора для всех процессов (аналогично первому сценарию). Полный более крупный окончательный сценарий выходит за рамки этого вопроса, и вам нужно будет сделать еще несколько исследований для его завершения, но это должно дать вам хорошее начало.

+0

Спасибо за ответ. Я проверю и дам вам знать завтра ... –

+0

Несколько комментариев. 'get-process cmd' не будет обнаруживать завершение конкретной подсказки cmd, если открываются несколько подсказок cmd. И win32_processor дает общее использование ЦП, а не использование CMD CPU. Хотя от OP, неясно, что нужно. –

+0

@ user2460798 Да, на самом деле я открою несколько командных подсказок и должен получить CPU Утилита каждой командной строки отдельно и сохранить результат в текстовом файле –

Смежные вопросы