使Powershell函数在管道调用和常规调用中都能正常工作

时间:2019-12-19 18:29:44

标签: powershell pipeline

说我具有以下Powershell功能:

function AddGos
{
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline=$True)]
        [string[]] $dbScript
    )
    process
    {
        $dbScript + "GO"
    }
}

如果我这样称呼:

("one", "two", "three") | AddGos 

我得到:

  

一个
  开始
  两个
  开始
  三个
  转到

但是,如果我这样称呼它:

AddGos("one", "two", "three")   

然后我得到了:

  

一个
  两个
  三个
  转到

这是因为当您作为管道运行时,它会破坏我的数组并为数组中的每个条目调用process部分。但是当您正常调用它时,它只是作为单个对象传入数组。

我可以看到一种使该简单方案同时支持这两种方案的方法,但是当您开始使用复杂的功能时,它可能很快变得太复杂而无法管理两种方案的工作。

在Powershell世界中通常如何处理?

意味着功能仅支持一种方式还是另一种方式?还是有一些简单的方法可以解决我所缺少的问题?还是函数作者真的很难使它以任何一种方式起作用?

1 个答案:

答案 0 :(得分:2)

在流程块中添加一个foreach循环来处理两种情况:

function AddGos {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$True)]
        [string[]] $dbScript
    )
    process {
        foreach ($item in $dbScript) {
            $item + "`r`nGO"
        }
    }
}

"one", "two", "three" | AddGos

AddGos "one", "two", "three"

这两个电话都将为您带来相同的结果:

one
GO
two
GO
three
GO

P.S。您不需要在数组元素周围放括号