2012-07-17 2 views
94

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

 
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 
... 

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

ответ

138

Это поможет вам подсчитать:

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)

+3

Я использовал '$ Counter = $ (get-alias | measure) .Count', поскольку он всегда возвращает значение 1, если есть только одно вхождение, как вы сказали. – DarkLite1

+4

Другой вариант: 'get-alias | мера | % {$ _. Count} ' – Shameer

+0

fyi:' measure' сокращен для 'Measure-Object'; и возвращает много другого материала - например, «Средняя», «Сумма», «Максимум» и т. д. – BrainSlugs83

83

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

@(Get-Alias).Count 

Пар точки отметить:

  1. Вы можете поставить сколь угодно сложное выражение вместо Get-Alias, например:

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

2012.01.30 Обновление

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

+7

Спасибо @msorens за выделение '@' здесь, чтобы получить выход! – Rama

+2

Я знаю, что это старо, но для других, которые ищут это ... v3 +, похоже, не работает без @ для count <2, если используется «Set-StrictMode -Version Latest». Я просто столкнулся с этим сегодня (на 5.1) - что-то работало интерактивно, что не работало в функции. Я отследил его до функции Set-StrictMode в нем; когда я устанавливал строгий режим в интерактивном режиме, это тоже не сработало. – vr8ce

+0

Хороший улов, @ vr8ce! Я сильный сторонник «Set-StrictMode», поэтому я должен был это заметить. –

11

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

(get-alias).count 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. –

+0

@ Damien OK. Я сделал редактирование. В SO люди обычно приходят от первого ответа до последнего. Они обычно не прыгают в третий ответ и не смущаются. Так что я сделал это как продолжение первых двух ответов. Этот ответ имеет больше смысла, чем этот отредактированный. – prabhakaran

1

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

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

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

Ответ он дал это один, в то время как

$output 

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

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

+0

Крис, я думаю, чтобы получить то, что вы хотели, чтобы вам нужно было это сделать: @ (Get-VmQuestion -VM vm1) .count Вы не можете заставить вывод быть массивом ... после вывода уже сделано. Это то, что вы делаете. –

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