Как вернуть довольно нулевое значение с помощью свойства Count из Get-Process? - PullRequest
5 голосов
/ 03 октября 2011

Сравните три сценария ниже:

Образец 1

$a = GPS | Where {$_.ProcessName -Match 'AcroRd32'}
$a
$a.Count

If ($a.Count -Eq 0)
{
    Echo "Adobe Reader is Off"
}
Else
{
    Echo "Adobe Reader is On"
}

# If Adobe Reader is not running, how come 0 (zero) is not returned?
# This is prettier, should I use it?  Or does it slow down performance?


<ч />

Образец 2

$a = GPS AcroRd32
$a
$a.Count

If ($a.Count -Eq 0)
{
    Echo "Adobe Reader is Off"
}
Else
{
    Echo "Adobe Reader is On"
}

# If Adobe Reader is not running, how come 0 (zero) is not returned?
# This is uglier, but it doesn't have to pipe any output, so does it have any performance gains?


<ч />

Образец 3

GPS AcroRd32 | Measure | Select -Expand Count

# 0 (zero) is returned, but with an ugly Error


<ч />

Полагаю, что часть моей проблемы в том, что я отношусь к PowerShell, как к VBS; написание кода таким образом / стилем обычно дает мне целочисленное значение, равное нулю, и не выдает никаких ошибок (если, конечно, Adobe Reader был выключен). Каков правильный PowerShell способ проверки того, что экземпляр программы не запущен? Вопросы производительности в комментариях являются второстепенными по отношению к вопросу «PowerShell Way».

P.S. Честно говоря, сообщение об ошибке, возвращаемое 3-м образцом, ничего не сломает, оно просто уродливо, поэтому оно не выходит за рамки практического использования, поэтому я полагаю, что настоящая проблема в том, что я просто любитель эстетики = ^ D

Ответы [ 3 ]

8 голосов
/ 03 октября 2011

Это обычная ошибка PowerShell.Команда может вернуть:

  • Ничего ~ null (не имеет свойства Count, получение его либо становится нулевым, либо завершается с ошибкой)
  • Один объект (он может иметь свой собственныйсвойство Count свойство, наиболее запутанный случай - может возвращать что угодно или может не иметь его, тогда получение Count становится нулевым или завершается с ошибкой)
  • 2 + массив объектов, имеющий свойство Count.

Решение простое.Когда вам действительно нужно количество возвращаемых объектов, используйте оператор @().Результатом всегда является массив, который имеет свойство Count.

# this is always an array
$result = @(<command returning something or nothing>)

# this is always a number:
$result.Count
2 голосов
/ 03 октября 2011

Я бы посоветовал вам сделать что-то вроде этого:

$count = @(get-process | ?{$_.ProcessName -eq "AcroRd32"}).count

if($count -eq 0){

write-host "Adobe Reader is Off"

} else{

write-host "Adobe Reader is On"

}

То, что сделано выше, заключается в том, что он принудительно возвращает возвращаемые объекты в массив, поэтому, если нет запущенных процессов чтения, вы получитепустой массив и, следовательно, его количество будет равно нулю.И когда у вас есть процессы, они есть в массиве, и вы получаете ненулевой счет, и приведенный выше код будет работать как положено.

Альтернатива на основе Sample2 / Sample3:

$acrobat = gps AcroRd32 -ErrorAction SilentlyContinue
if($acrobat){

    write-host "Adobe Reader is On"

} else{

    write-host "Adobe Reader is Off"

}

Выше мы подавляем ошибку, если читатель не работает.Затем, если установлен $ acrobat, вы знаете, что читатель работает.

Наблюдения за вашим кодом:

Когда читатель не работает, $ a ничего не назначается и, следовательно, $a.Count -eq 0будет ложнымКогда читатель работает, $ a присваивается этим объектам процесса, и вы получаете $ a.Count как 1 или более и, следовательно, снова ложь.Таким образом, вы всегда получите, что читатель включен.

1 голос
/ 03 октября 2011

вы упоминаете ошибку в третьем примере - вы можете скрыть сообщение, используя SilentlyContinue ErrorAction:

GPS -ea silentlycontinue AcroRd32 | Measure | Select -Expand Count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...