1

私が見つけたのは、次の関数を書くときです。

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
}

しかし、私は新しい変数を導入しているので、それは好きではありません。$ inputに影響を与えずに、コマンドレットにパイプする方法はありますか?

4

2 に答える 2

2

これを試して:

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

$input列挙子について読む

于 2012-10-30T14:38:07.477 に答える
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)であるため、$inputを呼び出しReset()て巻き戻すことができます。

.NETランドでは、すべての列挙子をリセットできるわけではないことに注意してください。PowerShellに、これが当てはまるシナリオがあるかどうかはわかりません$input

于 2012-10-30T14:38:19.430 に答える