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

这适用于管道输入和简单参数(非管道)使用。这最接近地模拟了二进制 cmdlet 的实际工作方式。

于 2012-12-06T16:31:05.123 回答