首页 > 解决方案 > 使 Powershell 函数在流水线和正常调用中都能正常工作

问题描述

假设我有以下 Powershell 功能:

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

如果我这样称呼它:

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

我得到:






但如果我这样称呼它:

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

然后我得到这个:


二三 去
_

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

我可以看到一种使这个简单场景同时支持这两种情况的方法,但是当您开始获得复杂的功能时,它很快就会变得过于复杂,无法同时管理这两种情况。

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

功能的含义仅支持一种方式或另一种方式?还是有一些简单的方法可以解决我缺少的这个问题?还是函数作者真的很努力地让它工作?

标签: powershellpipeline

解决方案


在流程块中添加一个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

PS你不需要数组元素周围的括号


推荐阅读