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

ber*_*d_k 33 parameters powershell

请试试这个:

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 ''
Run Code Online (Sandbox Code Playgroud)

这里f1抛出一个错误.现在试试

f2 $null 
f3 $null    
Run Code Online (Sandbox Code Playgroud)

这次只有f2抛出一个错误.我想要的是一个函数f,所以

f '' # is accepted
f $null # returns an error
Run Code Online (Sandbox Code Playgroud)

Sha*_*evy 62

Mandatory属性会阻止null和empty值,并提示您输入值.要允许空值(包括null),请添加AllowEmptyString参数属性:

function f1
{
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
    [AllowEmptyString()]
    [string]$Text
    )
    $text
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*min 6

以下是符合要求的解决方案.

function f1
{
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
    $Text
    )
    Write-Host 'Working'
    $text
}

f1 ''
f1 $null
Run Code Online (Sandbox Code Playgroud)

输出:

Working
f1 : Cannot bind argument to parameter 'Text' because it is null.
Run Code Online (Sandbox Code Playgroud)

警告

为了满足要求,我们必须省略显式类型声明[string].问题是PowerShell倾向于在[string]指定类型的任何地方将空值转换为空字符串.因此,如果我们使用类型声明,那么null值实际上永远不会出现在函数中.

PS以下是提交的相关问题: 无法将null作为null传递给具有String类型参数的.NET方法

  • +1 这就是我从一开始就说的;o) 但是你给出了解释,你就是那个人。 (2认同)