2012-11-23 23 views
12

Mam funkcję PowerShell, która zmienia wartości kluczy rejestru. Kod:Parametr obowiązkowy PowerShell zależy od innego parametru

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

Ma parametr „CreateNewChild” i jeśli flaga jest ustawiona, funkcja stworzy właściwość klucza, nawet jeśli to wa nie znaleziono. Parametr "PropertyType" musi być obowiązkowy, ale tylko wtedy, gdy ustawiono opcję "CreateNewChild".

Pytanie brzmi, jak ustawić parametr jako obowiązkowy, ale tylko wtedy, gdy określono inny parametr?

OK, bawiłem się z tym. I to działa:

param 
([Parameter(ParameterSetName="one")] 
[switch]$DoNotCreateNewChild, [string]$KeyPath, [string]$Name, [string]$NewValue, [Parameter(ParameterSetName="two")] 
[switch]$CreateNewChild, [Parameter(ParameterSetName="two",Mandatory=$true)] 
[string]$PropertyType 
) 

Oznacza to jednak, że $ KeyPath, $ Nazwa i $ NewValue nie są już obowiązkowe. Ustawienie "jednego" zestawu parametrów na obowiązkowe powoduje przerwanie kodu (zestaw parametrów nie może być rozwiązany błąd). Te zestawy parametrów są mylące. Jestem pewien, że jest sposób, ale nie mogę wymyślić, jak to zrobić.

Odpowiedz

21

Możesz pogrupować te parametry, definiując zestaw parametrów, aby to osiągnąć.

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

referencyjny:

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

--- Aktualizacja ---

Oto fragment, który naśladuje funkcje szukasz. Zestaw parametrów "Extra" nie zostanie przetworzony, dopóki nie zostanie wywołany przełącznik "Favourite".

[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" 
+0

Ja próbowałem, oto kod: 'param ( [parametr (pozycja = 0, Obowiązkowe = $ true) ] [string] $ KeyPath, [Parametr (pozycja = 1, obowiązkowa = $ prawda)] [ciąg] $ nazwa, [parametr (pozycja = 2, obowiązkowa = $ prawda)] [ciąg] $ nowaWartość, [parametr (ParameterSetName = "One")] [przełącznik] $ CreateNewChild, [Parametr (ParameterSetName = " One ", Mandatory = $ true)] [string] $ PropertyType ) ' Jednak to nie działa. Podczas próby wykonania: 'Set-RegistryKeyPropertyValue -KeyPath $ ścieżka -Nazwa $ name -NewValue 0' Prosi mnie o podanie wartości dla $ PropertyType, ponieważ jest to obowiązkowe – lime

+0

Przepraszam, powinienem być bardziej szczegółowy. Dodałem lepszy przykład do powyższej odpowiedzi. :) –

+0

Tak, właśnie tego szukałem! Dziękuję Ci! p.s. Jedna opcja, której nie próbowałem uczynić "$ Favourite" obowiązkową = $ false, domyślam się, że była ona fałszywa. Ta logika zestawu parametrów jest dziwna ... – lime

-2

można również wykorzystywać dynamiczny parametr:

new way to create dynamic parameter

+1

Tylko podanie linku do forum z językami obcymi nie jest pomocne w ogóle . Podaj przykład, który rozwiązałby opisany problem. –

+0

To jest dobra odpowiedź, dostępne są lepsze linki (http://www.powershellmagazine.com/2014/05/29/dynamic-parameters-in-powershell/) –

+0

https://msdn.microsoft.com/powershell/reference /5.1/Microsoft.PowerShell.Core/about/about_Functions_Advanced_Parameters#-47 –

Powiązane problemy