首页 > 解决方案 > 编写 Powershell 函数,可以通过管道输入和“正常”输入调用

问题描述

我有一个简单的功能:

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

        process {
            Write-Host $_ 
        }
    }

基于ValueFromPipelinein 可以使用带有管道输入的函数,例如

 "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
            }
        }
    }

以上模式适用于我的用例。但从我的角度来看foreach,在“流程”块中调用感觉很奇怪,因为(据我所知)每个管道项目都会调用流程块。因为有更好更简洁的方法来编写支持这两个用例的函数?

谢谢。

标签: powershell

解决方案


如果您想将数组传递给类似的参数,这就是您必须这样做的方式

Write-Log -Messages a,b,c  

否则你只能做

Write-Log -Messages a

您仍然可以在没有 foreach 的情况下通过管道输入数组:

Echo a b c | Write-Log

我很欣赏可以同时执行这两种操作的 cmdlet,例如 get-process。


推荐阅读