powershell - 编写 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
}
}
}
以上模式适用于我的用例。但从我的角度来看foreach
,在“流程”块中调用感觉很奇怪,因为(据我所知)每个管道项目都会调用流程块。因为有更好更简洁的方法来编写支持这两个用例的函数?
谢谢。
解决方案
如果您想将数组传递给类似的参数,这就是您必须这样做的方式
Write-Log -Messages a,b,c
否则你只能做
Write-Log -Messages a
您仍然可以在没有 foreach 的情况下通过管道输入数组:
Echo a b c | Write-Log
我很欣赏可以同时执行这两种操作的 cmdlet,例如 get-process。