Как подсчитать объекты в PowerShell?

Как я читаю в руководстве пользователя PowerShell, одна из основных концепций PowerShell заключается в том, что команды принимают и возвращают объекты вместо текста. Так, например, запуск get-alias возвращает мне несколько объектов System.Management.Automation.AliasInfo:

PS Z:\> get-alias

CommandType     Name                                             Definition
-----------     ----                                             ----------
Alias           %                                                ForEach-Object
Alias           ?                                                Where-Object
Alias           ac                                               Add-Content
Alias           asnp                                             Add-PSSnapIn
Alias           cat                                              Get-Content
Alias           cd                                               Set-Location
Alias           chdir                                            Set-Location
...

Теперь как получить количество этих объектов?

Ответ 1

Это позволит вам подсчитать:

get-alias | measure

Вы можете работать с результатом как с объектом:

$m = get-alias | measure
$m.Count

И если вы хотите также иметь псевдонимы в некоторой переменной, вы можете использовать Tee-Object:

$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases

Дополнительная информация о командлете Measure-Object находится на Technet.

Не путайте его с командлетом Measure-Command, который предназначен для измерения времени. (снова на Technet)

Ответ 2

Короче, чем @jumbo ответ:-), вы можете сделать это еще более кратко. Это просто возвращает свойство Count массива, возвращаемого антецедентным под-выражением:

@(Get-Alias).Count

Пара отмечает:

  • Вместо Get-Alias вы можете поставить произвольное сложное выражение, например:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  • Начальный знак at (@) необходим для надежного решения. До тех пор, пока ответ будет два или более, вы получите эквивалентный ответ с или без @, но когда ответ будет равен нулю или один вы получите нет, если у вас нет знака @! (Он заставляет свойство Count существовать, заставляя вывод быть массивом.)

2012.01.30 Обновление

Вышеизложенное верно для PowerShell V2. Одна из новых возможностей PowerShell V3 заключается в том, что у вас есть свойство Count даже для одиночных чисел, поэтому знак at становится несущественным для этого сценария.

Ответ 3

Просто используйте скобки и "count". Это относится к Powershell v3

(get-alias).count

Ответ 4

@($output).Count не всегда дает правильные результаты. Я использовал метод ($output | Measure).Count.

Я нашел это с помощью командлета VMware Get-VmQuestion:

$output = Get-VmQuestion -VM vm1
@($output).Count

Ответ, который он дал, - один, тогда как

$output

не выводил результат (правильный ответ был равен 0, как было получено с помощью метода Measure).

Это было похоже на случай с 0 и 1. Все, что было выше 1, было правильным при ограниченном тестировании.