2013-06-27 5 views
1

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

Пример:

param([Parameter(Mandatory=$true, Position=0)] 
    [ValidateSet("Add","Delete")] 
    [string]$Command, 

    [Parameter(Mandatory=$true)] 
    [string]$Subject 
) 

Я хочу, чтобы параметр Subject будет необходимо, только если параметр Command имеет значение «Добавить».

Я попытался использовать значение ParameterSetName, но это, похоже, не сработало.

+2

Какой ответ не работал раньше? Где находится предыдущий вопрос? – EBGreen

+0

http://stackoverflow.com/questions/13533763/powershell-mandatory-parameter-depend-on-other-parameter –

ответ

2

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

param(
    [parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command, 
    [string] $Subject 
) 
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) { 
    $Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add")' 
} 

Условия $PSBoundParameters['Subject'] -eq $null имеет значение Истину, если параметр Тема не указана. Обратите внимание, что вы не можете просто использовать $Subject -eq $null, потому что $ Subject инициализируется как пустая строка, если параметр опущен. Если вы не указали $ Subject (т. Е. Не укажете [string]), тогда он будет пустым, если он опущен, но я полагаю, вы не хотите этого делать.

Обратите внимание, что этот будет позволит пользователю просто нажать [ENTER], когда будет предложено, в результате чего $ Subject пустой, но это стандартное поведение для обязательных параметров. Если вы не хотите этого допускать, вы можете сделать одно из следующих действий (это еще одно преимущество обработки сложных требований к параметрам, подобных этому в теле, а не объявлении параметра).

Throw ошибку:

param(
    [parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command, 
    [string] $Subject 
) 
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) { 
    $Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add"' 
    if (-not $Subject) { 
    throw "The Subject may not be blank." 
    } 
} 

Keep предлагающее до тех пор, пока обеспечивается значение:

param(
    [parameter(Mandatory=$true)][ValidateSet("Add","Delete")] [string]$Command, 
    [string] $Subject 
) 
if (($Command -eq 'Add') -and ($PSBoundParameters['Subject'] -eq $null)) { 
    do { 
    $Subject = Read-Host 'Supply value for the parameter "Subject" (mandatory when the value of "Command" is "Add"' 
    if (-not $Subject) { 
     Write-Host -NoNewline "The Subject may not be blank. " 
    } 
    } until ($Subject) 
} 
+0

Это более надежная реализация, поэтому я, скорее всего, буду использовать это, спасибо. –

2

Вы могли бы попытаться сделать ваши параметры, как это:

param (
    [Parameter(ParameterSetName="Add")][switch]$Add, 
    [Parameter(ParameterSetName="Delete")][switch]$Delete, 
    [Parameter(ParameterSetName="Add",Mandatory=$true)] [Parameter(ParameterSetName="Delete")] [string]$Subject 
) 

Если у вас есть переключатель «Добавить», то Субъект является обязательным, если у вас есть переключатель «Удалить», то параметр Subject не является обязательным.

+0

Это неплохая идея, но я не думаю, что вы можете иметь повторяющиеся параметры с тем же именем. –

+2

Вы можете добавить параметр к множеству наборов параметров следующим образом: '[Параметр (ParameterSetName =" Добавить "; Обязательный = $ true)] [Параметр (ParameterSetName =" Удалить ")] [string] $ Subject'. Но см. Ответ, который я только что написал, чтобы он работал с параметрами, которые вы хотели использовать. –

+1

Отредактировано. Он должен работать так, как ожидалось. Изменен параметр Subject для включения обоих наборов параметров. Спасибо Ади Инбар за исправление. – HAL9256