功能管道支持,不能将参数绑定到参数

时间:2019-05-30 18:03:17

标签: powershell

我创建了以下简单的函数,其中参数支持来自管道的输入:

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

        process {
            Write-Host $_
        }
    }

如果我通过例如调用函数:

    "test1", "test2" | Write-Log

它按预期工作,但是如果我在管道中转发空字符串,则会出现以下错误:

C:\> "test1", "", "test2" | Write-Log
test1
Write-Log : Cannot bind argument to parameter 'PipeLineLoglines' because it is an empty string.
At line:1 char:24
+ "test1", "", "test2" | Write-Log
+                        ~~~~~~~~~
    + CategoryInfo          : InvalidData: (:String) [Write-Log], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Write-Log

test2

我正在使用PowerShell.Core:

C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.2.0
PSEdition                      Core
GitCommitId                    6.2.0
OS                             Microsoft Windows 10.0.17763
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

有人可以解释为什么空字符串会导致此错误吗?

Thx

1 个答案:

答案 0 :(得分:3)

这是因为参数为Mandatory,并且认为空字符串不满足该条件。鉴于有特定的验证属性可对此进行测试,因此我不喜欢这种行为,但事实就是这样。

[AllowEmptyString()]有一个属性可以为您提供帮助:

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

        process {
            Write-Host $_
        }
    }