Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算PowerShell中的对象数?_Powershell_Scripting - Fatal编程技术网

如何计算PowerShell中的对象数?

如何计算PowerShell中的对象数?,powershell,scripting,Powershell,Scripting,正如我在《PowerShell用户指南》中所读到的,PowerShell的核心概念之一是命令接受并返回对象,而不是文本。例如,运行get alias会返回许多System.Management.Automation.AliasInfo对象: PS Z:\> get-alias CommandType Name Definition ----------- ----

正如我在《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 ... PS Z:\>获取别名 命令类型名称定义 ----------- ---- ---------- 别名%ForEach对象 别名何处物体 别名ac添加内容 别名asnp Add PSSnapIn 别名cat获取内容 别名cd集位置 别名chdir集合位置 ...
现在,如何计算这些对象的数量?

这将为您计算:

get-alias | measure
您可以像处理对象一样处理结果:

$m = get-alias | measure
$m.Count
如果您希望在某些变量中也有别名,可以使用Tee对象:

$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases
有关度量对象cmdlet的更多信息,请参见


不要将其与用于时间测量的Measure Command cmdlet混淆。(再说一遍)

简而言之@jumbo的答案是:-)你可以做得更简洁。 这只返回antecedent子表达式返回的数组的
Count
属性:

@(Get-Alias).Count
需要注意的几点:

  • 您可以将任意复杂的表达式替换为
    Get Alias
    ,例如:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
    
  • 初始at符号(@)对于稳健的解决方案是必要的。只要答案是两个或更多,你将得到一个带@或不带@的等价答案,但当答案是零或一时,你将得到输出,除非你有@符号!(通过强制输出为数组,它强制存在
    Count
    属性。)

  • 2012.01.30更新


    上述情况适用于PowerShell V2。PowerShell V3的一个新功能是,即使对于单例,您也有一个
    Count
    属性,因此at符号在这种情况下变得不重要。

    只需使用括号和“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的任何内容都是正确的。

    在我的交换中,您提供的cmd不起作用,答案是空的,因此我必须进行一些更正,对我来说效果很好:

    @(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
    

    这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@Damien OK。我做了编辑。因此,人们通常从第一个答案到最后一个答案。他们不会突然跳进第三个答案而感到困惑。所以我把它作为前两个答案的延续。这个答案比这个经过编辑的答案更有意义。这一点已经在本文中介绍过了。你基本上只是重复已经说过两年的话。@利亚姆,答案是针对powershell v2的。我的答案是powershell v3。正如您所说,该答案在该答案的更新(2012.01.30更新)中有详细说明。我只是给出了编码部分。我使用了
    $Counter=$(获取别名|度量值)。Count
    因为它总是在只有一次出现的情况下返回值1,正如您所说。另一个选项:
    获取别名|度量值|%{$|.Count}
    仅供参考:
    度量值
    度量对象
    的缩写;并返回许多其他内容,如
    平均值
    总和
    最大值
    ,等等…为什么不只是(gal).计数?需要PS v3或更高的IIRC。编辑:这已经得到了回答。@SHAMER当我们在做的时候,你可以用它来摆脱
    %
    {}
    。更容易写和读的是另一个讨论。Chris,我认为要得到你想要的东西,你需要这样做:@(get-VmQuestion-VM-vm1)。计数你不能强制输出为数组。。。一旦输出已经完成。这就是你正在做的。我知道这是旧的,但对于其他寻找它的人来说…如果使用了@for count<2
    Set-StrictMode-Version-Latest
    ,v3+似乎不起作用。我今天(在5.1上)遇到了这个问题——一些交互工作的东西在函数中不起作用。我跟踪到函数中设置了StrictMode;当我以交互方式设置严格模式时,它也不起作用。捕捉得好,@vr8ce!我也是
    设置StrictMode
    的强烈拥护者,所以我应该注意到这一点。要扩展@vr8ce的建议,我不能使用@($myObject)来计算现有对象的数量。因此,在尝试测试count属性之前,我使用了
    if($myObject.PSobject.Properties.Name-包含“count”)
    (from)。我讨厌PoSH让我这么做,但严格模式是值得的。您已经分享了有关使用PowerShell从Exchange中提取信息的好信息,其中隐藏了一个计数,这是一个有效的答案,但不是这个问题的答案。如果您足够仔细地看,您将看到所有4个答案都给出了
    @(…).count
    语法。