【发布时间】:2012-07-16 14:21:01
【问题描述】:
正如我在 PowerShell 用户指南中所读到的,PowerShell 的核心概念之一是命令接受和返回 objects 而不是文本。例如,运行get-alias 会返回一些System.Management.Automation.AliasInfo 对象:
现在,我如何获得这些对象的数量?
【问题讨论】:
标签: powershell scripting
正如我在 PowerShell 用户指南中所读到的,PowerShell 的核心概念之一是命令接受和返回 objects 而不是文本。例如,运行get-alias 会返回一些System.Management.Automation.AliasInfo 对象:
现在,我如何获得这些对象的数量?
【问题讨论】:
标签: powershell scripting
Get-Alias|ForEach-Object {$myCount++};$myCount
158
【讨论】:
在我的交流中,你提供的 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 语法。
只需使用括号和“计数”。这适用于 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 的内容在有限的测试中都是正确的。
【讨论】:
@jumbo 的回答很短:-) 你可以做得更简洁。
这只是返回前面子表达式返回的数组的Count 属性:
@(Get-Alias).Count
需要注意的几点:
你可以用任意复杂的表达式代替Get-Alias,例如:
@(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
初始 at 符号 (@) 对于稳健的解决方案是必要的。只要答案是 2 或更大,您将得到带有或不带有 @ 的等效答案,但是当答案是 0 或 1 时,除非您有 @ 符号,否则您将得到 no 输出! (它通过强制输出为数组来强制 Count 属性存在。)
2012.01.30 更新
上述情况适用于 PowerShell V2。 PowerShell V3 的一项新功能是,即使对于单例,您也确实有一个 Count 属性,因此在这种情况下 at 符号变得不重要。
【讨论】:
Set-StrictMode -Version Latest,如果没有 @ for count
Set-StrictMode 的坚定拥护者,所以我应该注意到这一点。
if ($myObject.PSobject.Properties.Name -contains "count")(来自stackoverflow.com/questions/26997511/…)。我讨厌 PoSH 让我这样做,但严格模式是值得的。
【讨论】:
$Counter = $(get-alias | measure).Count,因为它总是返回值 1,以防只出现一次,就像你说的那样。
get-alias | measure | % { $_.Count }
measure 是 Measure-Object 的缩写;并返回很多其他的东西——比如Average、Sum、Maximum等等......
Get-Alias | Measure-Object | Select-Object -ExpandProperty Count 摆脱% 和{}。更容易写和读的有待讨论。