Windows PowerShell - 数组传递给函数

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)
    {
    }
}

为什么?

我写了你说的那段代码,它在我的电脑上运行良好,没有问题。 - EBGreen
我刚才错过了另一个错误,原因是在函数中有一个函数,在那个函数中我想要输出一些内容,但是只写了"echo"而没有参数。我来自Unix环境,当你在那里输入"echo"时,如果没有参数,它只会写入空行,但这种技巧在PS中不起作用...多么愚蠢的错误:D - stewenson
1
所选答案并未回答问题。我遇到了同样的问题,但并没有得到帮助。您在上面的评论中已经回答了这个问题,将其作为答案并选择它似乎更合适。 - Jacxel
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 实际工作方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接