2012-03-05 2 views
0

Я пытаюсь получить следующий счетчик в течение 5 минут. Если он возвращает 100, 5 раз подряд, я бы хотел получить электронное письмо.Как мне пройти через результаты get-counter, чтобы принять решение?

get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 60 -MaxSamples 5 

Я попытался назначить этот блок кода переменной, так например:

$value = get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 60 -MaxSamples 5 

if($value eq 100) 
{ 
    $counter = $counter + 1 
} 

if($counter > 4) 
{ 
"send an email" 
} 

Проблема заключается в том, что я не могу получить фактическое значение счетчика, чтобы получить назначения на $ value. Кроме того, я бы хотел, чтобы счетчик увеличивался каждый раз при срабатывании кода (до того, как он достигнет значения maxsamples).

Любая помощь будет высоко оценена.

ответ

0

Я думаю, что вы хотите что-то вроде этого:

$value = get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 5 
$Total = $Value | % { $_.CounterSamples[0].CookedValue } | Measure -Sum; 

if ($Total.Sum -ge 490) { 
    # Total CPU usage was 490+ 
} 

Или, если вы хотите сделать это в контексте процентах, это сделать:

$value = get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 5 
$Total = $Value | % { $_.CounterSamples[0].CookedValue } | Measure -Average; 

if ($Total.Average -ge 95) { 
    # Total CPU usage was 95%+ 
} 
0

Get-Counter возвращает массив Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet чтобы вы работали с ним следующим образом:

несколько более общее решение:


$sampleInterval = 60 # in seconds 
$samples = 50 # samples taken 
$inRowSamples = 5 # 5 samples in a row 
$shouldntExceed = 0.95 # 95% 

$values = get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval $sampleInterval -MaxSamples $samples 

$count = 0 
foreach ($value in $values) 
{ 
    if ($value.CounterSamples[0].CookedValue -gt $shouldntExceed) 
    { 
     $count++; 
    } 
    else 
    { 
     $count = 0; 
    } 

    if ($count -ge $inRowSamples) 
    { 
     # send email 
     break; 
    } 
} 

+0

Благодарит так много парней. Я думаю, что ответ Томаса ближе к тому, что мне нужно, но я знал, что чего-то не хватает. Мне нужно больше изучить структуру и как работает CookedValue. Очень признателен. – kickinchicken

0

Попробуйте это:

$maxCount = 5; 
$maxValue = 100; 
$count = 0; 
get-counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 5 | %{ 

    if($_.CounterSamples[0].CookedValue -ge $maxValue){ 
     $count++; 
    } 
    #handling the n times in a row condition 
    else{ 
     $count=0 
    } 
    if($count -eq $maxCount){ 
     write-host "exceeded" 
     #send email 
     break 
    } 

} 

Поскольку мы используем трубопровод, выше будет отправить по электронной почте, как только у вас есть 5 непрерывных значений больше или равных 100.

+0

Вам необходимо изменить параметр -MaxSamples для -Continuous, иначе вы будете только предупреждать, если счетчик превысит предел в первые N интервалов после запуска, как и предыдущие предложения. – jmb