繁体   English   中英

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

[英]Write Powershell function, that can be called with pipeline input AND “normal” input"

我有一个简单的功能:

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

        process {
            Write-Host $_ 
        }
    }

基于ValueFromPipeline ,可以将函数与管道输入配合使用,例如

 "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块。 是否存在更好的更干净的方式来编写支持两个用例的函数?

谢谢。

如果要将数组传递给类似这样的参数,就必须这样做

Write-Log -Messages a,b,c  

否则你只能做

Write-Log -Messages a

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

Echo a b c | Write-Log

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM