Как использовать параметр "-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
), а не вход
если вы просто ищете счет, вы можете сделать следующее:
$a = GPS AcroRd32
$a.Count = 2
$a = GPS AcroRd32
устанавливает $a в массив объектов процесса. Массив имеет вызов члена, Count, который позволит вам определить количество элементов уже.
на Измерения-Объект commandlet (с псевдонимом measure
) используется для измерения среднего, максимального, минимального и суммарного значений свойства. Так что вы могли бы сделать что-то вроде $a | measure -property Handles -sum
и получить подсчет общего количества открытые дескрипторы.