我创建了以下简单的函数,其中参数支持来自管道的输入:
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
答案 0 :(得分:3)
这是因为参数为Mandatory
,并且认为空字符串不满足该条件。鉴于有特定的验证属性可对此进行测试,因此我不喜欢这种行为,但事实就是这样。
[AllowEmptyString()]
有一个属性可以为您提供帮助:
function Write-Log {
[CmdletBinding()]
param (
# Lines to log
[Parameter(Mandatory , ValueFromPipeline )]
[AllowEmptyString()]
[string[]]
$PipeLineLoglines
)
process {
Write-Host $_
}
}