Как проверить параметры функции 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
Ответы
Ответ 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
- Пропускает, когда ввод представляет собой пустую строку
- Выход с неправильным типом сообщения, когда ввод не является строкой