Подтвердить что ты не робот

Как проверить параметры функции 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 ''

Здесь f1 выдает ошибку. Теперь попробуйте

f2 $null 
f3 $null    

На этот раз только f2 выдает ошибку. То, что я хочу, это функция f, так что

f '' # is accepted
f $null # returns an error
4b9b3361

Ответ 1

Обязательный атрибут блокирует нулевые и пустые значения и запрашивает значение. Чтобы разрешить пустые значения (включая null), добавьте атрибут параметра AllowEmptyString:

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

Ответ 2

Вот решение, которое соответствует требованиям с оговоркой.

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.

Caveat

Чтобы соответствовать требованиям, мы должны опустить явное объявление типа [string]. Проблема в том, что PowerShell имеет тенденцию преобразовывать нули в пустые строки везде, где указан тип [string]. Таким образом, если мы используем объявление типа, тогда нулевое значение фактически никогда не приходит к функции.

P.S. Вот связанная с этим проблема: Невозможно передать null как null в метод .NET, который имеет параметр типа String

Ответ 3

Просто для полноты, если вы хотите, чтобы ваш ввод был проверен на тип строки, вы можете сделать это после объявления параметров:

function f1
{
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
    $Text
    )
    if (!($text -eq '') -and !($text -as [string])) {write-host "wrong type"; return }
    $text
}

Эта функция ведет себя следующим образом:

  • Выдает исключение "Невозможно связать аргумент.." при вводе $null
  • Пропускает, когда ввод представляет собой пустую строку
  • Выход с неправильным типом сообщения, когда ввод не является строкой