Как подсчитать объекты в 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, было правильным при ограниченном тестировании.