Наборы параметров - как мне сделать работу по умолчанию?
Я пишу функцию, которая обновляет файл *.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, предоставленный вызывающей стороной. Это та же самая причина, почему задание значения по умолчанию для обязательного параметра не работает.