Как использовать параметр "-Property "для командлета PowerShell" Measure-Object"?

почему

$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



эта запись сценарист где я узнал, как использовать свойство "Count" в первом примере кода.

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

Import-Csv c:scriptstest.txt | Measure-Object score -ave -max -min

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

Import-Csv c:scriptstest.txt | Measure-Object -ave -max -min -property score

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

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

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

GPS AcroRd32 | Measure -Property Count # Fails

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

PS C:UsersMe> $a = GPS AcroRd32 | Measure
PS C:UsersMe> $a

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

PS C:UsersMe> $a -is [int]
False



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

если я должен использовать точечную нотацию, то я буду, но я хотел бы воспользоваться этой возможностью, чтобы узнайте больше о как и *почему PowerShell работает таким образом, а не просто создает поверхностное понимание синтаксиса PowerShell. Другими словами, Я хочу избежать превращения в Программист Культа Груза/ Обезьяний Код.

4 ответов


вам нужно знать, что в PowerShell в целом и в частности в Командлетах вы управляете объектами или коллекцией объектов.

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

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

(GPS AcroRd32).count

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

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

потому что COUNT свойство является свойством выход объект (т. е. Результаты Measure-Object), а не вход


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

gps AcroRd32 | measure-object | select -expand Count

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

$a = GPS AcroRd32
$a.Count = 2

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

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