Как использовать параметр "-Property" для командлета PowerShell "Measure-Object"? - PullRequest
6 голосов
/ 30 сентября 2011

Почему

$a = GPS AcroRd32 | Measure
$a.Count

работает, когда

GPS AcroRd32 | Measure -Property Count

не работает?

В первом примере возвращается значение 2, вот чтоЯ хочу, целое число.

Второй пример возвращает это:

Measure-Object : Property "Count" cannot be found in any object(s) input.
At line:1 char:23
+ GPS AcroRd32 | Measure <<<<  -Property Count
    + CategoryInfo          : InvalidArgument: (:) [Measure-Object], PSArgumentException
    + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

Эта запись сценариста - это то, где я узнал, как использовать свойство «Количество» в первом примере кода.

Второй пример кода действительно сбивает с толку.В этой справке Центра сценариев работает следующее утверждение:

Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min

Оно все еще работает, даже если переписано так:

Import-Csv c:\scripts\test.txt | Measure-Object -ave -max -min -property score

Я неУ меня слишком много проблем с принятием этого, пока я не рассмотрю справочную страницу Объект измерения .Определение параметра для -Property <string[]> гласит:

По умолчанию используется свойство Count (Длина) объекта.

Если Count является значением по умолчанию, тоне явный проход Count работа?

GPS AcroRd32 | Measure -Property Count # Fails

Следующая информация предоставляет мне необходимую информацию, за исключением того, что она не дает мне целое число для выполнения операций, как вы увидите:

PS C:\Users\Me> $a = GPS AcroRd32 | Measure
PS C:\Users\Me> $a

Count    : 2
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

PS C:\Users\Me> $a -is [int]
False

Итак, почему работает Dot Notation ($a.count), а не явно написанное утверждение (GPS | Measure -Property Count)?

Если я должен использовать Dot Notation, тогда я буду, но яЯ хотел бы воспользоваться этой возможностью, чтобы узнать больше о , как и *, почему PowerShell работает таким образом, а не просто о поверхностном понимании синтаксиса PowerShell.Другими словами, я хочу избежать превращения в Cargo Cult Programmer / Code Monkey .

Ответы [ 4 ]

6 голосов
/ 30 сентября 2011

Поскольку свойство COUNT является свойством объекта OUTPUT (т.е. результаты Measure-Object), а не объекта INPUT .

The *Параметр 1009 * указывает, какое свойство (свойства) входных объектов должно оцениваться.Ничего из этого не является COUNT, если вы не передаете массив или массивы или что-то еще.

5 голосов
/ 01 октября 2011

Одна вещь, которую вам нужно знать, это то, что в PowerShell в целом, и, в частности, в CmdLets, вы манипулируете объектами или коллекцией объектов.

Пример: если работает только один AcroRd32 Get-Process вернет [System.Diagnostics.Process], если запущено более одного, он вернет коллекцию [System.Diagnostics.Process].

Во втором случае вы можете написать:

(GPS AcroRd32).count

Потому что у коллекции есть свойство count. Коллекция объектов дуальности также допустима в параметрах CmdLets, которые большую часть времени поддерживают объекты или список объектов (коллекция, созданная с помощью оператора ,).

PS C:\> (gps AcroRd32) -is [object[]]
True

Просто используйте командлет Get-Member :

PS C:\> (gps AcroRd32) | Get-Member

   TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
...                        ...

И

PS C:\>  Get-Member -InputObject (gps AcroRd32)

   TypeName: System.Object[]

Name           MemberType    Definition
----           ----------    ----------
Count          AliasProperty Count = Length
...            ...
5 голосов
/ 30 сентября 2011

Я думаю, что вы хотите что-то вроде этого:

gps AcroRd32 | measure-object | select -expand Count
2 голосов
/ 30 сентября 2011

Если вы просто ищете счетчик, вы можете сделать следующее:

$a = GPS AcroRd32
$a.Count = 2

$a = GPS AcroRd32 устанавливает $ a для массива объектов процесса. В массиве есть вызов члена Count, который позволит вам уже определить количество элементов.

Командлет Measure-Object (с псевдонимом measure) используется для измерения среднего, максимального, минимального и суммарного значений свойства. Таким образом, вы можете сделать что-то вроде $a | measure -property Handles -sum и подсчитать общее количество открытых дескрипторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...