如何验证PowerShell函数参数允许空字符串?

时间:2011-06-19 15:33:54

标签: powershell parameters

请试试这个:

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

3 个答案:

答案 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
  • 时,抛出“无法绑定参数..”异常
  • 输入为空字符串时传递
  • 当输入不是字符串时退出错误类型