3

私は夢中になるこの問題を抱えています:

私は次のような機能を持っています

function xyz
{
    foreach($x in $input)
    {
    }
}

1..10 | xyz

これはファイル test.ps1 に保存されます。それを書くたびに「.\test.ps1」のように実行すると

cmdlet Write-Output at command pipeline position 1
Supply values for the following parameters:
InputObject[0]:

なぜそうなのですか?好きだとうまくいかない

$myArray = @("a","b","c")
xyz -arr $myArray

そして次のような機能を実行します

function xyz
{
    param(
        [string[]]$arr
    )

    foreach($x in $arr)
    {
    }
}

なんで?

4

1 に答える 1

5

表示されているエラーを再現することはできませんが、一般に、パイプライン入力を処理する場合、最も簡単な方法は次のようになります。

function xyz
{
    process {
        $_
    }
}

1..10 | xyz

processブロックは、パイプライン内のすべてのオブジェクトに対して呼び出されます。実際、これは十分に一般的なパターンであるため、PowerShellには次のようなさらに便利なショートカットがありますfilter

filter xyz
{
    $_
}

1..10 | xyz

ここで、パイプライン入力だけでなく通常のパラメーターも処理する必要がある場合は、パラメーター宣言を追加し、高度な関数パラメーター機能を使用する必要があります。

function xyz
{
    param(
        [Parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true)]
        [object[]]
        $myparam
    )
    process {
       foreach ($elem in $myparam)
       {
           $elem
       }
    }
}

xyz (1..10)
'a','b','c' | xyz

これは、パイプライン入力と単純なパラメーター(非パイプライン)の使用の両方で機能します。これは、バイナリコマンドレットが実際にどのように機能するかを最も厳密にエミュレートします。

于 2012-12-06T16:31:05.123 に答える