Sti*_*sfa 6 syntax powershell powershell-2.0
为什么
$a = GPS AcroRd32 | Measure
$a.Count
Run Code Online (Sandbox Code Playgroud)
工作,什么时候
GPS AcroRd32 | Measure -Property Count
Run Code Online (Sandbox Code Playgroud)
不?
第一个示例返回一个值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
Run Code Online (Sandbox Code Playgroud)
这个Scripting Guy条目是我学习如何在第一个代码示例中使用"Count"属性的地方.
第二个代码示例真的令人困惑.在此脚本中心参考中,以下语句有效:
Import-Csv c:\scripts\test.txt | Measure-Object score -ave -max -min
Run Code Online (Sandbox Code Playgroud)
它仍然有效,即使它重写如此:
Import-Csv c:\scripts\test.txt | Measure-Object -ave -max -min -property score
Run Code Online (Sandbox Code Playgroud)
在我考虑Measure-Object帮助页面之前,接受这个问题没有太多问题.状态的参数定义-Property <string[]>:
默认值为对象的Count(Length)属性.
如果Count是默认值,那么不应该显式传递Count工作吗?
GPS AcroRd32 | Measure -Property Count # Fails
Run Code Online (Sandbox Code Playgroud)
以下为我提供了我需要的信息,除了它没有为我提供执行操作的整数,正如您将看到的:
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
Run Code Online (Sandbox Code Playgroud)
那么,为什么Dot Notation($a.count)可以工作,而不是一个明确的语句(GPS | Measure -Property Count)?
如果我应该使用Dot Notation,那么我会,但我想借此机会更多地了解PowerShell 如何以及为什么以这种方式工作,而不仅仅是建立对PowerShell语法的敷衍理解.换句话说,我想避免变成Cargo Cult Programmer/Code Monkey.
因为该COUNT属性是OUTPUT对象的属性(即结果Measure-Object),而不是INPUT对象.
该-property参数指定要评估输入对象的哪些属性.COUNT除非您传递数组或数组或其他内容,否则这些都不是.
我认为您想要的是这样的:
gps AcroRd32 | measure-object | select -expand Count
Run Code Online (Sandbox Code Playgroud)
您需要知道的一件事是,在PowerShell中,特别是在CmdLets中,您可以操纵对象或对象集合.
示例:如果只有一个'AcroRd32'正在运行Get-Process将返回a [System.Diagnostics.Process],如果多个正在运行它将返回一个集合[System.Diagnostics.Process].
在第二种情况下,您可以写:
(GPS AcroRd32).count
Run Code Online (Sandbox Code Playgroud)
因为集合具有count属性.对偶对象集合在CmdLets参数中也有效,大多数情况下CmdLets参数支持对象或对象列表(使用运算符构建的集合,).
PS C:\> (gps AcroRd32) -is [object[]]
True
Run Code Online (Sandbox Code Playgroud)
只需使用Get-Member cmdlet:
PS C:\> (gps AcroRd32) | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
... ...
Run Code Online (Sandbox Code Playgroud)
和
PS C:\> Get-Member -InputObject (gps AcroRd32)
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
... ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10734 次 |
| 最近记录: |