come faccio a forzare almeno un parametro da un set specificato?

ho una funzione PowerShell che prende una stringa, e tre interruttori. così l'invocazione sarebbe qualcosa di simile:

My-Function "some string" -Switch1 -Switch2 -Switch3

tuttavia, voglio fare funzionare questa funzione solo se la stringa e almeno un interruttore è fornito. così: così:

My-Function "some string" -Switch1 -Switch3  # Valid
My-Function "some string" -Switch2           # Valid
My-Function "some string"                    # Invalid

so che potrei farlo controllando se gli switch sono stati passati usando l'oggetto $MyInvocation, ma c'è un modo per farlo usando gli attributi Parameter e ParameterSet?

in breve, questo è quello che sto cercando di fare:

  • la stringa deve essere fornita ogni volta che la funzione è chiamata.
  • almeno un interruttore deve essere fornito ogni volta che la funzione è chiamata.

En title : How do I force at least one parameter from a set be specified?

5 Comments:

    1. l'OP vuole far rispettare che almeno uno degli interruttori -Switch1, -Switch2 e -Switch3 sia presente. rendere obbligatorio un parametro impone la presenza di questo esatto interruttore ogni volta che la funzione viene chiamata.
    1. inoltre, solo la stringa è obbligatoria ogni volta. aggiornamento OP per riflettere questo.
  1. non credo che si possa fare questo con i set di parametri e parametri obbligatori. se hai definito 3 diversi set di parametri con parametro obbligatorio alternato come questo:

    Param(
      [Parameter(Mandatory=$true)]
      [string]$Text,
    
      [Parameter(Mandatory=$true, ParameterSetName='o1')]
      [Parameter(Mandatory=$false, ParameterSetName='o2')]
      [Parameter(Mandatory=$false, ParameterSetName='o3')]
      [Switch][bool]$Switch1,
    
      [Parameter(Mandatory=$false, ParameterSetName='o1')]
      [Parameter(Mandatory=$true, ParameterSetName='o2')]
      [Parameter(Mandatory=$false, ParameterSetName='o3')]
      [Switch][bool]$Switch2,
    
      [Parameter(Mandatory=$false, ParameterSetName='o1')]
      [Parameter(Mandatory=$false, ParameterSetName='o2')]
      [Parameter(Mandatory=$true, ParameterSetName='o3')]
      [Switch][bool]$Switch3
    )
    

    funziona se si utilizza solo uno degli interruttori:

    My-Function "foo" -Switch2
    

    ma non riesce se si utilizza più di un interruttore:

    PS C:\> .\test.ps1 "foo" -Switch1 -Switch2
    C:\test.ps1 : Parameter set cannot be resolved using the specified named
    parameters.
    At line:1 char:1
    + .\test.ps1 "foo" -Switch1 -Switch2
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [test.ps1], ParameterBindingException
        + FullyQualifiedErrorId : AmbiguousParameterSet,test.ps1
    

    userei invece un parametro obbligatorio impostato:

    Param(
      [Parameter(Mandatory=$true)]
      [string]$Text,
    
      [Parameter(Mandatory=$true)]
      [ValidateSet('Switch1', 'Switch2', 'Switch3', ignorecase=$true)]
      [string[]]$Options
    )
    

    ciò permetterebbe di chiamare la funzione come questa:

    My-Function "foo" -Options Switch1
    My-Function "foo" -Options Switch2,Switch3
    

    oppure puoi rendere tutti e tre gli switch opzionali e validarli all'interno della funzione:

    Param(
      [Parameter(Mandatory=$true)]
      [string]$Text,
    
      [Parameter(Mandatory=$false)]
      [Switch][bool]$Switch1,
    
      [Parameter(Mandatory=$false)]
      [Switch][bool]$Switch2,
    
      [Parameter(Mandatory=$false)]
      [Switch][bool]$Switch3
    )
    
    if (-not ($Switch1.IsPresent -or $Switch2.IsPresent -or $Switch3.IsPresent)) {
      throw 'Missing switch'
    }
    

    i parametri dinamici potrebbero essere un'altra opzione, ma non posso dirlo per certo.

    1. non pensavo di usare ValidateSet. che in realtà potrebbe funzionare meglio per questa funzione. grazie per questo.

More similar articles:

  • come forzare l'uso di un file .ini da un percorso specificato
  • come determinare se ogni lato di un rettangolo di stringhe contiene almeno un carattere specificato?
  • come posso forzare un parser SAX ad usare una DTD se non è specificato nel file di input?
  • come forzare l'utente ad inserire almeno un carattere o alcuni caratteri che non possono essere bypassati in python 3?
  • come posso forzare l'applicazione ad usare solo libreria dal percorso specificato in c #?
  • come posso forzare l'utente ad avere almeno una casella di controllo selezionata e postback da javascript lato client?
  • come forzare IntelliJ IDEA ad usare il nome del file del jar specificato nella gradle.build come nome del manufatto?
  • come forzare il testo del pulsante ad aderire al testo specificato nel layout
  • come forzare Mathematica a mostrare un razionale con il denominatore che ho specificato?
  • come forzare Catalyst:: controller:: resto per eseguire il rendering di una vista a seguito di una richiesta POST, se non è stato specificato alcun tipo di contenuto?
  • come forzare un errore personalizzato in grunt se l'argomento della riga di comando non è specificato?
  • come forzare ValidationAttributo a contrassegnare i membri oggetto specificato come non valido?
  • Ansible: come controllare se il dizionario ha almeno un valore specificato?
  • come forzare una TextView ad essere alta almeno una riga anche quando è vuota?
  • scikit-imparare - come forzare la selezione di almeno una singola etichetta in LinearSVC
  • forzare almeno un argomento per il parametro rest
  • come forzare il mio AJAX chiamato elementi per aggiungere nello stesso ordine come ho specificato nel mio array?
  • come forzare un utente a selezionare almeno una casella radio
  • come posso impostare il titolo del post predefinito quando qualcuno andrà ad aggiungere nuovo post non segnaposto, forzare per impostare almeno 1 categoria e 3 tag
  • come forzare matplotlib ad espandere la gamma per almeno due zecche
  • come forzare almeno un termine da una lista in una ricerca di testo completa in MongoDB
  • come forzare Liferay Dev Studio ad usare il JDK che ho specificato? (jdk8)
  • come forzare almeno un argomento da un insieme in Docopt?
  • come forzare un listbox ad avere sempre almeno un elemento selezionato ed evidenziato?
  • come forzare il compilatore Java a compilare SOLO il file sorgente specificato?
  • come forzare python print numpy datetime64 con il fuso orario specificato?
  • come forzare dateFormat a prendere esattamente il numero di caratteri specificato come valido?
  • come trovare tutti gli entire (messaggi) che contengono almeno un tag specificato. dati di primavera
  • esiste un modo per forzare la classe bambino ad avere almeno un campo con un attributo specificato?
  • REACT + Redux: come forzare l'esistenza dell'elemento di caricamento di almeno 0,5 secondi