2012-11-23 11 views
12

Ho una funzione di PowerShell che modifica i valori delle chiavi del Registro di sistema. Codice:I parametri obbligatori di PowerShell dipendono da altri parametri

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

Ha un parametro "CreateNewChild", e se è impostato che la bandiera, la funzione creerà la proprietà chiave, anche se si wa non trovato. Il parametro "PropertyType" deve essere obbligatorio, ma solo se è stato impostato il flag "CreateNewChild".

La domanda è, come rendere obbligatorio un parametro, ma solo se è stato specificato un altro parametro?

OK, ci ho giocato un po '. E questo funziona:

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

Tuttavia, questo significa che $ KeyPath, $ nome e $ NewValue non sono più obbligatori. L'impostazione del parametro "uno" su obbligatorio interrompe il codice (il set di parametri non può essere risolto). Questi set di parametri sono confusi. Sono sicuro che c'è un modo, ma non riesco a capire come farlo

risposta

21

È possibile raggruppare tali parametri definendo un set di parametri per ottenere ciò.

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

Riferimento:

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

--- --- Aggiornamento

Ecco un frammento di codice che imita le funzionalità che si stanno cercando. Il set di parametri "Extra" non verrà elaborato se non viene chiamato l'interruttore -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" 
+0

Ho provato questo, ecco il codice: 'param ( [parametri (posizione = 0, Mandatory = $ true) ] [stringa] $ KeyPath, [Parametro (Posizione = 1, Obbligatorio = $ true)] [stringa] $ Nome, [Parametro (Posizione = 2, Obbligatorio = $ vero)] [stringa] $ NuovoValore, [Parametro (ParameterSetName = "One")] [switch] $ CreateNewChild, [Parametro (ParameterSetName = " Uno ", Obbligatorio = $ vero)] [stringa] $ PropertyType ) ' Tuttavia, questo non funziona. Quando si tenta di eseguire quanto segue: 'Set-RegistryKeyPropertyValue -KeyPath $ percorso -Nome $ nome -NuovoValore 0' Mi chiede di fornire il valore per $ PropertyType, poiché è obbligatorio – lime

+0

Spiacente, avrei dovuto essere più specifico. Ho aggiunto un esempio migliore alla risposta sopra. :) –

+0

Sì, questo è esattamente quello che stavo cercando! Grazie! p.s. L'unica opzione che non ho provato a rendere obbligatorio "$ Favorite" = $ false, ho pensato che fosse falso per impostazione predefinita. Questo parametro di logica è strano ... – lime

-2

è anche possibile utilizzare parametro dinamico:

new way to create dynamic parameter

+1

Solo fornire un collegamento a un forum di lingue straniere non è affatto utile . Si prega di fornire un esempio che risolva il problema descritto. –

+0

Questa è una buona risposta sono disponibili collegamenti migliori (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 –