Наборы параметров - как мне сделать работу по умолчанию?

Я пишу функцию, которая обновляет файл *.CSV, который будет выбран скриптовым сценарием, который обновит зону DNS. Поскольку я не хочу ломать настоящий файл.CSV, я добавил фиктивный файл. Пока я разрабатываю эту функцию, у меня есть три набора параметров: Reset, Add, а также Remove, Эти параметры перезаписывают мой фиктивный файл текущим каноническим файлом.CSV, добавляют запись и удаляют запись соответственно. Основной сценарий никогда не вызовет функцию с активными двумя или всеми тремя этими переключателями.

Вот как я кодировал блок параметров моего скрипта:

function Update-DNS_Dev
{
    [CmdletBinding(defaultparametersetname='Reset')]
    [OutputType([int])]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true,
                   Position=0,
                   ParameterSetName='Reset')]
        [switch]$Reset,

        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0,
            ParameterSetName='Remove')]
        [switch]$Remove,

        [Parameter(Mandatory=$true,
            ValueFromPipelineByPropertyName=$true,
            Position=0,
            ParameterSetName='Add')]
        [switch]$Add,

        # Name of a Dummy file
        [Parameter(ValueFromPipelineByPropertyName=$true,
                   Position=1)]
        [string]$DummyFile = "{0}\dPvmnames.csv" -f $DNSScratchpad,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Remove')]
        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [string]$servername,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Remove')]
        [string]$domain,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [string]$details,

        [Parameter(ValueFromPipelineByPropertyName=$true,
                    ParameterSetName='Add')]
        [string]$type
    )
}

Ниже в сценарии я использую switch ($psCmdlet.ParameterSetName) обрабатывать различные функции коммутаторов. Когда я делаю Get-Help Update-DNS Я вижу ожидаемый результат:

PS> get-help Update-DNS_Dev

NAME
    Update-DNS_Dev

SYNTAX
    Update-DNS_Dev [-Reset] [[-DummyFile] <string>]  [<CommonParameters>]

    Update-DNS_Dev [-Remove] [[-DummyFile] <string>] [-servername <string>] [-domain <string>]  [<CommonParameters>]

    Update-DNS_Dev [-Add] [[-DummyFile] <string>] [-servername <string>] [-domain <string>] [-details <string>] [-type <string>]  [<CommonParameters>]

Когда я вызываю функцию и поставляю -Reset параметр, мой сценарий выполняется должным образом, но если я вызываю его без каких-либо параметров, мой по умолчанию не вступает в силу, и удар 1, $true, true или клавишу Enter, чтобы принять то, что по умолчанию -Reset Параметр всегда выдает красное сообщение об ошибке:

 PS> Update-DNS_Dev 
Командлет Update-DNS_Dev в позиции 1 конвейера команд
Введите значения для следующих параметров:
(Введите!? Для справки.)
Сброс: 

Update-DNS_Dev: не удалось обработать преобразование аргумента для параметра "Сброс".
Невозможно преобразовать значение "System.String" в тип "System.Management.Automation.
SwitchParameter ". Логические параметры принимают только логические значения и числа,
такие как $True, $False, 1 или 0.
В строке:1 символ:1
+ Update-DNS_Dev
+ ~~~~~~~~~~~~~~
    + CategoryInfo: InvalidData: (:) [Update-DNS_Dev], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId: ParameterArgumentTransformationError,Update-DNS_Dev 

Есть ли у кого-нибудь предложение о том, как я могу получить свою функцию, чтобы взять -Reset переключить по умолчанию, если код, вызывающий функцию, не предоставляет никаких параметров?

1 ответ

Решение

Хотя я бы обычно поощрял [Switch] параметры должны быть обязательными, когда они определяют набор параметров, в вашем случае вы не можете иметь его таким образом, и, как сказал PetSerAl, вы должны сделать его необязательным.

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

Другие вопросы по тегам