2012-11-23 12 views
12

Ich habe eine PowerShell-Funktion, die die Registrierungsschlüsselwerte ändert. Code:PowerShell obligatorischer Parameter hängt von anderem Parameter ab

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

Es hat einen Parameter „CreateNewChild“ und wenn das Flag gesetzt ist, wird die Funktion der Schlüsseleigenschaft zu erstellen, auch wenn es gefunden Wan't. Der Parameter "PropertyType" muss zwingend sein, aber nur, wenn das Flag "CreateNewChild" gesetzt wurde.

Die Frage ist, wie man einen Parameter obligatorisch macht, aber nur, wenn ein anderer Parameter angegeben wurde?

OK, ich habe damit herumgespielt. Und das funktioniert:

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

Dies bedeutet jedoch, dass $ KeyPath, $ Name und $ NewValue nicht mehr obligatorisch. Wenn der Parameter "1" auf "obligatorisch" gesetzt wird, wird der Code unterbrochen (Parametersatz kann nicht aufgelöst werden). Diese Parametersätze sind verwirrend. Ich bin sicher, dass es einen Weg gibt, aber ich kann nicht herausfinden, wie es geht

Antwort

21

Sie könnten diese Parameter gruppieren, indem Sie einen Parametersatz definieren, um dies zu erreichen.

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

Referenz:

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

--- --- Aktualisierung

Hier ist ein Ausschnitt, dass imitiert die Funktionalität die Sie suchen. Der Parametersatz "Extra" wird nur verarbeitet, wenn der Schalter "Favorit" aufgerufen wird.

[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

ich das versucht habe, hier ist der Code: 'param ( [Parameter (Position = 0, Mandatory = $ true) ] [string] $ KeyPath, [Parameter (Position = 1, Obligatorisch = $ true)] [string] $ Name, [Parameter (Position = 2, Obligatorisch = $ true)] [string] $ NewValue, [Parameter (ParameterSetName = "Eins")] [Schalter] $ CreateNewChild, [Parameter (ParameterSetName = " One ", Mandatory = $ true)] [Zeichenfolge] $ PropertyType ) ' Dies funktioniert jedoch nicht. Bei dem Versuch, folgendes auszuführen: 'Set-RegistryKeyPropertyValue -KeyPath $ pfad -Name $ name -NeuerWert 0' Er fordert mich auf, den Wert für $ PropertyType anzugeben, da es obligatorisch ist – lime

+0

Entschuldigung, ich hätte genauer sein sollen. Ich habe der obigen Antwort ein besseres Beispiel hinzugefügt. :) –

+0

Ja, genau das habe ich gesucht! Vielen Dank! p.s. Die eine Option, die ich nicht versucht habe, "$ Favourite" obligatorisch zu machen = $ false, ich dachte, dass sie standardmäßig falsch war. Diese Parametersatzlogik ist seltsam ... – lime

-2

Sie können auch dynamische Parameter verwenden:

new way to create dynamic parameter

+1

Es ist überhaupt nicht hilfreich, einen Link zu einem Fremdsprachenforum bereitzustellen . Bitte geben Sie ein Beispiel an, das das beschriebene Problem lösen würde. –

+0

Dies ist eine gute Antwort bessere Links sind verfügbar (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 –

Verwandte Themen