PowerShell:$ input值的功能变化

时间:2012-10-30 14:25:53

标签: powershell

我发现当我编写以下函数时:

function test {
    Write-Host ($input | Measure-Object).Count
    Write-Host ($input | Measure-Object).Count
}

带样本输入:

dir | test

它在控制台上写道:

18
0

我认为这是因为Measure-Object的第一个管道覆盖了$ input。我知道一个解决方法,我会创建一个新数组并传递它:

function test {
    $inp = @($input)
    Write-Host ($inp | Measure-Object).Count
    Write-Host ($inp | Measure-Object).Count
}

但我不喜欢它,因为我正在引入一个新变量。有没有办法管道到cmdlet,同时保持$ input不受影响?

2 个答案:

答案 0 :(得分:2)

试试这个:

function test {    
 Write-Host ($input | Measure-Object).Count
 $input.reset()
 Write-Host ($input | Measure-Object).Count
}

reading about $input enumerator

答案 1 :(得分:2)

$inputArrayListEnumeratorSimple

C:\Users\roger> $input.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
False    True     ArrayListEnumeratorSimple                System.Object

...这意味着它是一系列项目的枚举器。因此,当您使用其中的项目时,您可以使用它们。

我尝试了以下内容:

function foo
{
    $input | select -first 3 | % { Write-Host -ForegroundColor 'Red' $_ }
    $input | % { Write-Host -ForegroundColor 'White' $_ }
}

...表明select -first 3吃了前3个项目,但似乎吞下了所有这些项目。

尝试以下方法:

function bar
{
    $n = 0
    foreach ($x in $input) {
        if ( ++$n -eq 3 ) { break }
        Write-Host -ForegroundColor 'Red' $x
    }

    $input | % { Write-Host -ForegroundColor 'White' $_ }
}

dir | bar

...显示了差异。

但是,由于$ input是一个枚举器(严格来说是IEnumerator),你可以在其上调用Reset()来回放它。

请注意,在.NET-land中,并非所有枚举器都可以重置。我不确定PowerShell中是否存在$input的情况。