【问题标题】:How to get count of pipe objects? I don't want accumulate pipe to buffer如何获取管道对象的数量?我不想累积管道来缓冲
【发布时间】:2017-08-08 10:32:59
【问题描述】:

假设我有一些 powershell 代码:

function count-pipe {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true)]
        [object[]]$inputObject
    )

    process {
        $PipeCount = <# How to get count of the pipe? Expect: #> 5

        Write-Output $inputObject # path-throw
    }
}

1..5 | count-pipe | % { $_ }

是的,我可以对临时变量求和/测量计数并使用 tee cmdlet。我认为这个解决方案会使管道暂停。我认为临时变量也不是一个与内存消耗相关的好解决方案。

我可以在不累积到临时变量的情况下获得管道对象数吗?

谢谢。

【问题讨论】:

  • 你打算如何使用$PipeCount,为什么$PipeCount++不是一个解决方案?
  • 管道的要点是一次只能有一个对象。那你是想预测未来吗?不知道没有临时变量你会怎么做

标签: powershell count pipe


【解决方案1】:

我认为使用计数器变量是我会使用的解决方案:

function count-pipe {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true)]
        [object[]]$InputObject
    )
    Process {
        $PipeCount++
        $_
    }
    End {
        Write-Verbose $PipeCount
    }

}

'a','b' | count-pipe -verbose | % { $_ }

【讨论】:

  • @Mark Wragg,谢谢。您的代码在管道完成后获取管道计数。问题是:如何在进程中获取 pipe.count? )))
  • @gms0ulman,是的。此评论是对以前版本的答案。使用这个版本 pipe.count 需要正确的值 ater cmdlet run ))) 问题是:如何在进程中获取 pipe.count?
  • 如何获取process 内的管道数?你不这样做,因为process 块为每个项目运行一次,因为每个项目“到达”管道中。要对项目进行计数,请预先收集所有项目并迭代集合(如 foreach 语句)或使用计数器(如在此答案中)。
【解决方案2】:

找到替代答案:

使用Measure-Object

Powershell:

@(1,2,3) | Measure-Object

输出:

Count    : 3
Average  :
Sum      :
Maximum  :
Minimum  :
Property :

Powershell:

1..5 | Measure-Object -AllStats

输出:

Count             : 5
Average           : 3
Sum               : 15
Maximum           : 5
Minimum           : 1
StandardDeviation : 1.58113883008419
Property          :

对于这个用例:

Powershell:

$listMeasure = $list | Measure-Object
$listCount = $listMeasure.Count

来自herehere 的示例

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多