正如我在 PowerShell 用户指南中阅读的那样,PowerShell 的核心概念之一是命令接受并返回 objects 而不是文本。例如,运行 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 ...
现在,我如何获得这些对象的数量?
就像@jumbo 的回答一样简短:-) 你可以做得更简洁。这只是返回由前面的子表达式返回的数组的 Count
属性:
@(Get-Alias).Count
有几点需要注意:
您可以使用任意复杂的表达式代替 Get-Alias,例如:@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count强大的解决方案。只要答案是 2 或更大,您将得到带有或不带有 @ 的等效答案,但是当答案是 0 或 1 时,除非您有 @ 符号,否则您将不会得到任何输出! (它通过强制输出为数组来强制存在 Count 属性。)
2012.01.30 更新
以上适用于 PowerShell V2。 PowerShell V3 的一项新功能是,即使对于单例,您也确实有一个 Count
属性,因此在这种情况下 at 符号变得不重要。
Set-StrictMode -Version Latest
。我今天刚刚遇到这个问题(在 5.1 上)——一些交互工作的东西在函数中不起作用。我将其追踪到具有 Set-StrictMode 的函数;当我以交互方式设置严格模式时,它也不起作用。
Set-StrictMode
的坚定拥护者,所以我应该注意到这一点。
if ($myObject.PSobject.Properties.Name -contains "count")
(来自 stackoverflow.com/questions/26997511/…)。我讨厌 PoSH 让我这样做,但严格模式是值得的。
只需使用括号和“计数”。这适用于 Powershell v3
(get-alias).count
@($output).Count
并不总是产生正确的结果。我使用了 ($output | Measure).Count
方法。
我通过 VMware Get-VmQuestion cmdlet 找到了这个:
$output = Get-VmQuestion -VM vm1
@($output).Count
它给出的答案是一个,而
$output
没有产生任何输出(正确答案是使用 Measure
方法产生的 0)。
这似乎只是 0 和 1 的情况。任何高于 1 的东西在有限的测试中都是正确的。
在我的交流中,你提供的 cmd-let 不起作用,答案是空的,所以我不得不做一些更正并且对我来说很好:
@(get-transportservice | get-messagetrackinglog -Resultsize unlimited -Start "MM/DD/AAAA HH:MM" -End "MM/DD/AAAA HH:MM" -recipients "user@domain.com" | where {$_.Event
ID -eq "DELIVER"}).count
@(...).Count
语法。
Get-Alias|ForEach-Object {$myCount++};$myCount
158
$Counter = $(get-alias | measure).Count
因为它总是返回值 1 以防只有一次出现。get-alias | measure | % { $_.Count }
measure
是Measure-Object
的缩写;并返回许多其他内容——例如Average
、Sum
、Maximum
等...Get-Alias | Measure-Object | Select-Object -ExpandProperty Count
摆脱%
和{}
。更容易编写和阅读的是另一个讨论。