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

Проверить наличие параметра в функции

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

function T
{
    Param
    (
        [switch] $IsValueNameRegularExpression
    )

    ..
}

Обычно, чтобы определить, существует ли параметр, вы бы выполнили if ($Param), только видя, что это [switch], если функция вызывается как T -IsValueNameRegularExpression:$false, возвращает false на if ($IsValueNameRegularExpression), хотя параметр существует - т.е. вызывающий вызывал значение для необязательного параметра.

Если я изменил тип параметра от [switch] до [bool], то произойдет то же самое.

В коде для моей функции я вызываю некоторые методы .NET, которые содержат настройки по умолчанию для параметров [bool] `[switch]`, поэтому, если пользователь не указал значение (будь то true или false), я не знаю, t хочет передать его методу .NET.

Я мог бы присваивать значения по умолчанию параметру, соответствующему значениям по умолчанию для метода .NET, но это предполагало бы, что значение по умолчанию метода .NET никогда не изменяется, что может быть неверным...

Итак, есть ли более элегантный способ сделать это?

4b9b3361

Ответ 1

Используйте $PSBoundParameters.ContainsKey(), чтобы проверить наличие параметра:

function T
{
    Param
    (
        [switch] $IsValueNameRegularExpression
    )

    $PSBoundParameters.ContainsKey('IsValueNameRegularExpression')
}

T
T -IsValueNameRegularExpression
T -IsValueNameRegularExpression:$false

Вывод:

False
True
True

Ответ 2

Более простой (и более точный способ) - использовать свойство IsPresent. Используя примерно тот же код:

function T {
    Param (
        [switch] $IsValueNameRegularExpression
    )
    $IsValueNameRegularExpression.IsPresent
}

T
T -IsValueNameRegularExpression
T -IsValueNameRegularExpression:$false

выводит следующий результат:

False
True
False

Обратите внимание, что привязка переключателя к false делает его "нет"

Ответ 3

function T 
{
    Param([switch]$IsValueNameRegularExpression)

    $IsValueNameRegularExpression.ToBool()
}

Результаты

T
False

T -IsValueNameRegularExpression
True

T -IsValueNameRegularExpression:$true
True

T -IsValueNameRegularExpression:$false
False