0

Можно ли использовать несколько наборов для того, чтобы сделать два набора параметров, не связанных друг с другом, но включенных с двумя другими наборами? Например, скажем, у меня было четыре параметра:Множество наборов параметров в PowerShell

param(
    $param1, 
    $param2, 
    $param3, 
    $param4, 
) 

Param1 и 2 являются взаимоисключающими друг друга, но может быть вызван ли называется 3 или 4. Аналогично, param3 и 4 исключают друг друга, но могут быть вызваны вызовом 1 или 2. Это окей наборы параметров, которые могут быть вызваны вместе:

./MyScript.ps1 -param1 -param3 
./MyScript.ps1 -param1 -param4 
./MyScript.ps1 -param2 -param3 
./MyScript.ps1 -param2 -param4 

Они не должны быть вызваны в то же время:

./MyScript.ps1 -param1 -param2 
./MyScript.ps1 -param1 -param3 -param4 
./MyScript.ps1 -param2 -param3 -param4 
./MyScript.ps1 -param3 -param1 -param2 
./MyScript.ps1 -param4 -param1 -param2 
./MyScript.ps1 -param3 -param4 

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

[Parameter(ParameterSetName="onethree",Mandatory=$true,HelpMessage="a or b")] 
[Parameter(ParameterSetName="onefour",Mandatory=$true,HelpMessage="a or b")] 
[ValidateSet("a","b")] 
[string]$one, 
[Parameter(ParameterSetName="twothree",Mandatory=$true)] 
[Parameter(ParameterSetName="twofour",Mandatory=$true)] 
[switch]$two, 
[Parameter(ParameterSetName="onethree")] 
[Parameter(ParameterSetName="twothree")] 
[string[]]$PropertyClass, 
[Parameter(ParameterSetName="onefour")] 
[Parameter(ParameterSetName="twofour")] 
[string[]]$PropertyName 

Скрипт выполняется, но не завершается правильно (если я называю его два $, он пытается сделать что-то с $ одна и причин сценарий для отказа). Если я ввожу возможные параметры, я не вижу двух долларов; но если я напечатаю -t и ударил [tab], он будет автозаполнен до -two. Любые идеи, что может быть причиной этого? Можно ли делать то, что я ищу?

+1

Это может помочь, если вы указали командную строку, которая фактически не срабатывала. В более общем плане вы считаете, что иметь только два параметра, которые имеют 2 возможных значения, могут иметь больше смысла. –

+0

Я думаю, что автозаполнение - две красные селедки. Я проверил блоки набора параметров с помощью $ PSCmdlet.ParameterSetName и получил соответствующие параметры для каждого из необходимых тестовых примеров, а ошибки «Параметр не может быть разрешен» для каждого из нежелательных тестовых случаев. Я считаю, что ошибка находится где-то в остальной части скрипта, а не в определенных наборах параметров. –

ответ

3

Использование Get-Help

Лучший способ увидеть, что параметр множества является использование Get-Help My-Function. Я создал функцию, называемую Test-Sets с вашим данным param() блока, и это выход из Get-Help:

SYNTAX 
    Test-Sets -one <string> {a | b} [-PropertyName <string[]>] [<CommonParameters>] 

    Test-Sets -one <string> {a | b} [-PropertyClass <string[]>] [<CommonParameters>] 

    Test-Sets -two [-PropertyName <string[]>] [<CommonParameters>] 

    Test-Sets -two [-PropertyClass <string[]>] [<CommonParameters>] 

Это выглядит, как он удовлетворяет ваши требования, если вы всегда хотите 2 параметра, в этом случае я думаю, единственное, вам нужно сделать, чтобы сделать $PropertyClass и $PropertyName обязательным в каждом из своих наборов параметров.

Если у меня что-то не хватает, пожалуйста, уточните и включите команду failing в качестве запроса @mike z.

+0

Требуется один из первых двух параметров, и оба свойства и класс свойств являются необязательными. Независимо от того, какой из первых двух параметров вызывается, должен быть вызван только один из двух последних параметров, а другой из первых двух параметров не может быть вызван; однако это не так. Я могу вызвать «-one» test «-PropertyName» test «-two» test ». Это ограничивает меня только одним параметром -Property *, но это не ограничивает использование '-one' или' -two', как только я вызываю один из параметров '-Property * '. – EGr

+0

Мне нужно придумать лучший неудачный пример, чтобы показать вам, не показывая мой фактический код. Я напишу что-нибудь, когда придумаю. – EGr

+0

Вы также можете опубликовать вывод 'Get-Help'. Фактический код не отображается, поэтому, если сами имена параметров не являются секретными, это не должно быть проблемой. – briantist