2016-01-29 3 views
0

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

.\zipandrotate.ps1 -Zip [-AllButDays <int>] -Rotate [-MaxRetentionDays <int>] 

-Zip и поэтому -AllButDays являются обязательными как -Rotate и -MaxRetentionDays.

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

[CmdletBinding(DefaultParameterSetBame="zip")] 
param(
    [Parameter(Mandatory=$false, ParameterSetName="zip")] 
    [Switch]$Zip, 

    [Parameter(Mandatory=$true, ParameterSetName="rotate")] 
    [Switch]$Rotate, 

    [Parameter(ParameterSetName="zip", Mandatory=$true)] 
    [int]$AllButDays, 

    [Parameter(ParameterSetName="rotate", Mandatory=$false)] 
    [int]$MaxRetentionDays 
) 

Я получаю следующее сообщение об ошибке в PowerShell 5 (Windows 10) и PowerShell 4 (Windows 7):

PS C:\>.\zipandrotate.ps1 -Zip -AllButDays 2 -Rotate -MaxRetentionDays 2 
C:\zipandrotate.ps1 : Parameter set cannot be resolved using the specified named 
parameters. 
At line:1 char:1 
+ .\zipandrotate.ps1 -Zip -AllButDays 2 -Rotate -MaxRetentionDays 2 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [zipandrotate.ps1], ParameterBindingException 
    + FullyQualifiedErrorId : AmbiguousParameterSet,zipandrotate.ps1

Запуск команды тремя разными способами говорит мне проблема в попытке использовать -Zip и -Rotate в то же время.

работы:

.\zipandrotate.ps1 -zip -allbutdays 2 
.\zipandrotate.ps1 -rotate -maxretentiondays 90 

не работает:

.\zipandrotate.ps1 -zip -allbutdays 2 -rotate -maxretentiondays 90 

Итак, есть 4 пути я вижу, мой сценарий происходит:

Разрешено: Просто застежка-молния, просто повернуть, оба
Не разрешено: Нет

Любые советы о том, как я получаю там? Добавление третьего набора параметров изменило ситуацию. Только -Zip и -Rotate работал; индивидуальное использование больше не имело каких-либо уникальных случаев, чтобы определить, какой набор параметров они были. Есть ли способ получить функциональность, я хочу удалить необходимость в дополнительном параметре для запуска -Zip или -Rotate?

+0

Если это единственное требуемое значение, можете ли вы просто объединить каждый набор? '-ZipAllButDays: 2'? – Eris

ответ

0

Я не думаю, что то, что вы просите, может быть реализовано с помощью статических наборов параметров. Вам нужно будет использовать либо dynamic parameters, либо дополнительный код подтверждения внутри функции.

Однако, я не думаю, что я бы параметризовал сценарий, как вы, в первую очередь. Ваши параметры состоят из двух переключателей, каждый из которых связан с одним параметром. Это означает, что вы можете полностью отключить коммутаторы и просто использовать параметры. Поскольку вы, похоже, хотите реализовать поворот журнала или что-то в этом роде, я бы, вероятно, сделал оба параметра опционными и дал им нормальные значения по умолчанию, например. например:

[CmdletBinding()] 
param(
    [Parameter(Mandatory=$false)] 
    [ValidateRange(1,120)] 
    [int]$MaxRetention = 30, # days 

    [Parameter(Mandatory=$false)] 
    [ValidateRange(1,30)] 
    [int]$CompressAfter = 2 # days 
) 
+0

Спасибо за ответ. Я собираюсь погрузиться в динамические параметры и посмотреть, могу ли я делать то, что я там хочу. –