Як порахувати об’єкти в PowerShell?


140

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

PS Z: \> get-псевдонім

Визначення імені CommandType
----------- ---- ----------
Псевдонім% ForEach-Object
Псевдонім? Де-об’єкт
Псевдонім ac Додатковий вміст
Псевдонім asnp Add-PSSnapIn
Псевдонім кота Get-Content
Псевдонім CD Set-Location
Псевдонім chdir Set-Location
...

Тепер, як мені отримати кількість цих об’єктів?

Відповіді:


201

Це дозволить вам рахувати:

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

6
Ще один варіант:get-alias | measure | % { $_.Count }
Shameer

fyi: measureскорочено Measure-Object; і повертає багато інших речей - як Average, Sum, Maximumі т.д ...
BrainSlugs83

1
Чому б не просто (gal) .count? Потрібен IIRC PS v3 або вище. EDIT: на це вже відповіли.
уранібаба

4
@Shameer Хоча ми це робимо, можна Get-Alias | Measure-Object | Select-Object -ExpandProperty Countпозбутися %і {}. Що легше писати і читати - це ще одна дискусія.
ЛосМанос

110

Як тільки відповідь @ jumbo така :-), ви можете зробити це ще коротше. Це просто повертає Countвластивість масиву, повернутого допоточним виразом:

@(Get-Alias).Count

Пара зазначає:

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

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

2012.01.30 Оновлення

Сказане вище стосується PowerShell V2. Однією з нових особливостей PowerShell V3 є те, що у вас є Countвластивість навіть для одиночних клавіш, тому ат-знак стає неважливим для цього сценарію.


3
Я знаю, що це по-старому, але для інших, хто шукає це ... v3 +, здається, не працює без рахунку @ для <<2, якщо Set-StrictMode -Version Latestвін використовується. Я щойно зіткнувся з цим сьогодні (на 5.1) - щось працювало інтерактивно, що не працювало у функції. Я відстежив його до функції, в якій є Set-StrictMode; коли я інтерактивно встановив суворий режим, він також не працював.
vr8ce

Гарний улов, @ vr8ce! Я теж сильний захисник Set-StrictMode, тому я мав це помітити.
Майкл Соренс

Щоб розширити поради @ vr8ce, я не міг використати @ ($ myObject), щоб отримати підрахунок існуючого об'єкта. Тому я використовую if ($myObject.PSobject.Properties.Name -contains "count")(від stackoverflow.com/questions/26997511/… ) перед тим, як спробувати перевірити властивість підрахунку. Я ненавиджу, що PoSH змушує мене це робити, але жорсткий режим того вартий.
duct_tape_coder

21

Просто використовуйте круглі дужки та "порахуйте". Це стосується Powershell v3

(get-alias).count

1
Це не дає відповіді на запитання. Щоб критикувати або вимагати роз'яснення у автора, залиште коментар під їх публікацією.
Zo Has

@Damien ОК. Я зробив правки. У ЗО люди, як правило, виходять від першої відповіді до останньої. Вони не раптом стрибають у третю відповідь і плутаються. Так що я зробив це як продовження перших двох відповідей. Ця відповідь має більше сенсу, ніж ця відредагована.
прабхакаран

1
Про це вже висвітлено у цій відповіді . Ви в основному просто повторюєте те, що вже було сказано через два роки після того, як це було сказано.
Ліам

1
@Liam Ця відповідь стосується повноважень v2. Моя відповідь - це повноваження v3. Як ви сказали, ця відповідь висвітлюється / розповідається буквально в оновленнях (оновлення 2012.01.30) у цій відповіді. Я просто дав кодування частину.
прабхакаран

5

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

Я виявив це за допомогою командлета VMware Get-VmQuestion:

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

Відповідь, яку він дав, - одна, тоді як

$output

не дало результату (правильна відповідь була 0, як було отримано Measureметодом).

Це здавалося лише у випадку 0 і 1. Все, що перевищує 1, було правильним при обмеженому тестуванні.


Кріс, я думаю, щоб отримати те, що ви хотіли, що вам потрібно це зробити: @ (Get-VmQuestion -VM vm1) .count Ви не можете змусити вихід бути масивом ... як тільки вихід вже зроблений . Що це ти робиш.
Даніель Піл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.