Подтвердить что ты не робот

Обязательный параметр PowerShell зависит от другого параметра

У меня есть функция PowerShell, которая изменяет значения ключа реестра. Код:

param(
    [Parameter()] [switch]$CreateNewChild,
    [Parameter(Mandatory=$true)] [string]$PropertyType
)

У него есть параметр "CreateNewChild", и если этот флаг установлен, функция создаст свойство ключа, даже если оно не было найдено. Параметр "PropertyType" должен быть обязательным, но только если был установлен флаг "CreateNewChild".

Вопрос в том, как сделать параметр обязательным, но только если был указан другой параметр?

Хорошо, я играл с этим. И это работает:

param(
  [Parameter(ParameterSetName="one")]
  [switch]$DoNotCreateNewChild,

  [string]$KeyPath,

  [string]$Name,

  [string]$NewValue,

  [Parameter(ParameterSetName="two")]
  [switch]$CreateNewChild,

  [Parameter(ParameterSetName="two",Mandatory=$true)]
  [string]$PropertyType
)

Однако это означает, что $ KeyPath, $ Name и $ NewValue больше не являются обязательными. Установка "одного" параметра в значение "обязательно нарушает код" (ошибка "набор параметров не может быть разрешен"). Эти наборы параметров сбивают с толку. Я уверен, что есть способ, но я не могу понять, как это сделать.

4b9b3361

Ответ 1

Вы можете сгруппировать эти параметры, определив набор параметров, чтобы выполнить это.

param (
    [Parameter(ParameterSetName='One')][switch]$CreateNewChild,
    [Parameter(ParameterSetName='One',Mandatory=$true)][string]$PropertyType
)

Ссылка:

http://blogs.msdn.com/b/powershell/archive/2008/12/23/powershell-v2-parametersets.aspx

http://blogs.technet.com/b/heyscriptingguy/archive/2011/06/30/use-parameter-sets-to-simplify-powershell-commands.aspx

--- Обновить ---

Вот фрагмент, который имитирует функциональность, которую вы ищете. Набор параметров "Extra" не будет обрабатываться, если не вызывается "-Favorite".

[CmdletBinding(DefaultParametersetName='None')] 
param( 
    [Parameter(Position=0,Mandatory=$true)] [string]$Age, 
    [Parameter(Position=1,Mandatory=$true)] [string]$Sex, 
    [Parameter(Position=2,Mandatory=$true)] [string]$Location,
    [Parameter(ParameterSetName='Extra',Mandatory=$false)][switch]$Favorite,      
    [Parameter(ParameterSetName='Extra',Mandatory=$true)][string]$FavoriteCar
)

$ParamSetName = $PsCmdLet.ParameterSetName

Write-Output "Age: $age"
Write-Output "Sex: $sex"
Write-Output "Location: $Location"
Write-Output "Favorite: $Favorite"
Write-Output "Favorite Car: $FavoriteCar"
Write-Output "ParamSetName: $ParamSetName"