我发现当我编写以下函数时:
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不受影响?
答案 0 :(得分:2)
试试这个:
function test {
Write-Host ($input | Measure-Object).Count
$input.reset()
Write-Host ($input | Measure-Object).Count
}
答案 1 :(得分:2)
$input
是ArrayListEnumeratorSimple
:
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
的情况。