如何计算PowerShell中的对象?

uli*_*tko 127 powershell scripting

正如我在PowerShell用户指南中所读到的,PowerShell的核心概念之一是命令接受并返回对象而不是文本.例如,运行会get-alias返回许多System.Management.Automation.AliasInfo对象:

PS Z:\> get-alias

CommandType     Name                                             Definition
-----------     ----                                             ----------
Alias           %                                                ForEach-Object
Alias           ?                                                Where-Object
Alias           ac                                               Add-Content
Alias           asnp                                             Add-PSSnapIn
Alias           cat                                              Get-Content
Alias           cd                                               Set-Location
Alias           chdir                                            Set-Location
...

现在,我如何获得这些对象的数量?

jum*_*mbo 186

这会让你数数:

get-alias | measure
Run Code Online (Sandbox Code Playgroud)

您可以像对象一样处理结果:

$m = get-alias | measure
$m.Count
Run Code Online (Sandbox Code Playgroud)

如果你想在某个变量中也有别名,你可以使用Tee-Object:

$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases
Run Code Online (Sandbox Code Playgroud)

有关Measure-Object cmdlet的更多信息,请访问Technet.

不要将它与用于时间测量的Measure-Command cmdlet混淆.(再次在Technet上)

  • 另一种选择:`get-alias | 措施| %{$ _.Count}` (6认同)
  • 我使用`$ Counter = $(get-alias | measure).Count`,因为它总是返回值1,以防只有一次出现,就像你说的那样. (3认同)
  • @Shameer虽然我们正在使用它,但可以使用[`Get-Alias | 测量对象| Select-Object -ExpandProperty Count`](/sf/answers/3514943421/)摆脱`%`和`{}`.更容易编写和阅读是另一个讨论. (3认同)

Mic*_*ens 103

只要@jumbo的回答是:-)你可以更简洁地做到这一点.这只返回Count先行子表达式返回的数组的属性:

@(Get-Alias).Count
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  1. 您可以使用任意复杂的表达式代替Get-Alias,例如:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
    Run Code Online (Sandbox Code Playgroud)
  2. 初始符号(@)是稳健解决方案所必需的.只要答案是两个或更多,你会得到一个等价的答案,有或没有@,但当答案是零或一个你将得到没有输出,除非你有@符号!(它Count通过强制输出为数组来强制属性存在.)

2012.01.30更新

以上适用于PowerShell V2.PowerShell V3的一个新功能是Count即使对于单身人士也有一个属性,因此对于这种情况,at-sign变得不重要.

  • 感谢@msorens突出显示'@'用法以获得输出! (7认同)
  • 我知道这是旧的,但是对于那些寻找这个的人来说...如果没有使用@,如果使用Set-StrictMode -Version Latest`,那么v3 +似乎无法工作.我今天刚刚遇到这个问题(在5.1上) - 交互式工作的东西在函数中不起作用.我跟踪它的功能有Set-StrictMode; 当我以交互方式设置严格模式时,它也不起作用. (3认同)

pra*_*ran 18

只需使用括号和'计数'.这适用于Powershell v3

(get-alias).count
Run Code Online (Sandbox Code Playgroud)


小智 5

@($output).Count并不总是产生正确的结果。我用的($output | Measure).Count方法。

我是通过VMware Get-VmQuestion cmdlet找到的:

$output = Get-VmQuestion -VM vm1
@($output).Count
Run Code Online (Sandbox Code Playgroud)

它给出的答案是一个,而

$output
Run Code Online (Sandbox Code Playgroud)

没有产生任何输出(正确答案是使用该Measure方法产生的0 )。

对于0和1,似乎只有这种情况。在有限的测试中,大于1的任何内容都是正确的。