请试试这个:
function f1
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
[string]
$Text
)
$text
}
function f2
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
#[string]
$Text
)
$text
}
function f3
{
param(
[Parameter(Mandatory=$False,ValueFromPipelineByPropertyName=$true)]
[string]
$Text
)
$text
}
f1 ''
f2 ''
f3 ''
这里f1抛出错误。现在试试
f2 $null
f3 $null
这次只有f2会抛出错误。我想要的是一个函数f,所以
f '' # is accepted
f $null # returns an error
答案 0 :(得分:57)
Mandatory属性会阻止null和empty值,并提示您输入值。 要允许空值(包括null),请添加AllowEmptyString参数属性:
function f1
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
[AllowEmptyString()]
[string]$Text
)
$text
}
答案 1 :(得分:6)
以下是满足要求的解决方案。
function f1
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
$Text
)
Write-Host 'Working'
$text
}
f1 ''
f1 $null
输出:
Working
f1 : Cannot bind argument to parameter 'Text' because it is null.
<强>买者强>
为了符合要求,我们必须省略[string]
的显式类型声明。问题是PowerShell倾向于在指定[string]
类型的任何地方将空值转换为空字符串。因此,如果我们使用类型声明,那么null值实际上永远不会出现在函数中。
P.S。以下是提交的相关问题: It isn't possible to pass null as null into a .NET method that has a parameter of type String
答案 2 :(得分:1)
为了完整起见,如果您希望根据字符串类型验证输入,则可以在以后的参数声明中进行验证:
function f1
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
$Text
)
if (!($text -eq '') -and !($text -as [string])) {write-host "wrong type"; return }
$text
}
此功能的行为如下:
$null