编写Powershell函数,该函数可以通过管道输入和“常规”输入来调用

时间:2019-05-31 15:23:20

标签: powershell

我有一个简单的功能:

    function Write-Log {
        [CmdletBinding()]
        param (
            # Lines to log
            [Parameter(Mandatory , ValueFromPipeline )]
            [AllowEmptyString()]
            $messages
        )

        process {
            Write-Host $_ 
        }
    }

基于ValueFromPipeline的in可以将函数与管道输入一起使用,例如

 "a","b", "c" | Write-Log
 a
 b
 c

没关系。但是,如果我想以这种方式使用我的函数:

 Write-Log -message "a", "b", "c"

自动$_变量为空,不打印任何内容。

我还找到了这两个stackoverflow链接:

他们两个都建议采用以下模式:

  function Write-Log {
        [CmdletBinding()]
        param (
            # Lines to log
            [Parameter(Mandatory , ValueFromPipeline )]
            [AllowEmptyString()]
            $messages
        )

        process {
            foreach ($message in $messages){
                Write-Host $message
            }
        }
    }

以上模式适用于我的用例。但是从我的角度来看,在“ process”块中调用foreach很奇怪,因为(据我所知)每个管道项目都需要调用process块。是否存在更好的更干净的方式来编写支持两个用例的函数?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果要将数组传递给类似

的参数,就必须这样做
dat %>% 
    mutate_at(vars(colsOfInterst), list(~ fct_recode(., !!! nm1)))

否则你只能做

Write-Log -Messages a,b,c  

您仍然可以在不使用foreach的情况下通过管道传递数组:

Write-Log -Messages a

我非常感谢cmdlet可以同时执行两种操作,例如get-process。