Set [Parameter (mandatory = $true/$false)] basierend auf dem Wert eines anderen Parameters in der powershell

Schreibe ich eine Funktion in der PowerShell 3.0 . Ein parameter in der Funktion gesetzt werden sollten, als zwingend abhängig vom Wert eines anderen Parameters.

Die Funktion declaratioin wäre wie folgt:

function removeVolumeandArrayFromHost(){
Param( [Parameter(mandatory = $true)] [ValidateSet('iSCSI','FC')] $arrayType, ##IpAddress/Name of the target host 
   [Parameter(mandatory = $true)] $volumeName, ##Name of the volume to be disconnected. (Volume name as in the array.)
   [Parameter(mandatory = $false)] $FCACL, ##Access control list name to which volume is added (Related to FC Array only)

   ## Work with the parameters given.
}

In der oben genannten Funktion, Der parameter ‚$arrayType‘ kann den Wert ‚iSCSI‘ oder ‚FC‘.

Den parameter $FCACL sollte obligatorisch(mandatory = $true), wenn $arrayTpe = ‚FC‘. wenn $arrayType = ‚iSCSI‘ dann die $FCACL sollte der parameter nicht obligatorisch (mandatory = $false)

Versuchte ich mit parametersetname aber es dosent helfen, da muss ich lookinto der Wert des Parameters $arrayType zu entscheiden, wenn $FCACL wäre zwingend erforderlich ist oder nicht.

Jede Art von Hilfe oder Hinweise wäre sehr dankbar.

Vielen Dank im Voraus. 🙂

  • In der Regel in etwas wie dieses, ich würde schreiben beginnen/Prozess/Ende und am Anfang würd ich Griff Validierung dieses und Schreiben-Fehler, wenn es nicht das war, was ich wollte.
  • Sie müssen die dynamischen Parameter, die für, die.
  • Ich habe keine Zeit für eine ausführliche Antwort, aber Sie können dies tun, mit die DynamicParam keyword. Es ist ein bisschen Arbeit aber. Die Art und Weise @ChrisN-Befürworter ist oft einfacher. In beiden Fällen, wenn Sie mit der pipeline kann es nicht wie erwartet funktionieren, so testen Sie gründlich.
  • Sie können check out meine Antwort aus this Frage für Sie einige Informationen zum arbeiten mit dynamischen Parametern.
  • Zu klären, die Sie nicht wollen, dass die $FCACL angegeben werden, wenn das iSCSI-transport verwendet wird, richtig? (FCACL würde keinen Sinn machen, in diesem Fall).
  • Ja.
  • Der begin/Prozess half mir, als wäre ich dem Aufruf dieser Funktion in anderen Skripts und dem Aufruf dieser Funktion würde nicht dynamisch ändern, je nach array-Typ. Vielen Dank für deinen Tipp. 🙂
  • Danke für die info über Dynamische Parameter:)
  • Ich fügte hinzu, das als Antwort in dem Fall, dass es jemandem hilft.

InformationsquelleAutor user3543477 | 2016-02-01



3 Replies
  1. 2

    Nutzen Sie die Dynamischen Parameter, oder, wenn Sie Ihre $arrayType variable auf einen Schalter, dann können Sie ParameterSetName um Dinge zu machen, obligatorisch. So Dinge wie diese:

    Function removeVolumeandArrayFromHost(){
    Param( 
        [Parameter(ParameterSetName="FC")][switch]$FC,
        [Parameter(ParameterSetName="iSCSI")][switch]$iSCSI,
        [Parameter(ParameterSetName="FC",Mandatory=$true)] [string]$FCACL,
    
        [Parameter(mandatory = $true)] [string]$volumeName
    )
    ....
       ## Work with the parameters given.
    }

    Oder, wenn Sie wissen, dass Sie sind nur den Umgang mit entweder FC oder iSCSI, dann sind Sie nur wirklich brauchen, eine switch-Anweisung zu sagen, ob oder nicht es ist der FC, oder nicht. Wenn die -FC – Schalter vorhanden ist, dann wird es rufen die ParameterSetName=FC und erfordern die -FCACL parameter. Wenn Sie ausschließen, die -FC wechseln, Sie davon ausgehen, es ist, iSCSI, und die ParameterSetName wird, stellen Sie sicher, dass Sie nicht verlangen -FCACL.

    Function removeVolumeandArrayFromHost(){
    Param( 
        [Parameter(ParameterSetName="FC")][switch]$FC,
        [Parameter(ParameterSetName="FC",Mandatory=$true)] [string]$FCACL,
    
        [Parameter(mandatory = $true)] [string]$volumeName
    )
    ....
       ## Work with the parameters given.
    }
    • Ich schlage vor, das gleiche. Sollten Sie [Parameter(ParameterSetName="iSCSI",Mandatory=$false)] zu $FCACL, obwohl, da der parameter soll optional sein für den iSCSI-parameter festlegen, ob ich verstehe die Frage richtig.
    • Ja, du hast Recht. Ich dachte, ich hinzufügen, dass (für eine komplette Lösung, die es Hinzugefügt werden soll), aber ich war zu raten durch den Namen „FC…ACL“, dass es FC-spezifisch 😉
    • OP-Kommentare bestätigen, dass FCACL ist FC-spezifisch.
    • Danke für die Antwort. Mithilfe der begin/Prozess/Ende half mir in diesem Fall. Vielen Dank, dass mich wissen, das Konzept der dynamischen Parameter, es würde mir helfen, in der Zukunft 🙂
  2. 0

    Eine Möglichkeit ist die Verwendung der Begin – /Prozess – /End-Teile von der Funktion und der Handhabung dieser Art von Sachen in den „Beginnen“ – Teil, statt um eine Dynamische Parameter, wie die anderen Antworten vorgeschlagen haben.

    • Danke Chris, dein Vorschlag hat perfekt funktioniert. Ich habe das code-snippet, das wie eine Antwort für mehr Klarheit.
  3. 0

    Den Vorschlag gegeben, von Chris N funktionierte perfekt in meinem Fall, da ich zu tun hatte mit nur einen parameter auf diese Weise. Mein Verständnis ist, dass die Dynamischen Parameter wäre eine bessere option sein, wenn der Umgang mit vielen dieser Parameter.

    Ich füge den code hier für wesentlich mehr Klarheit.

    function removeVolumeandArrayFromHost(){
        Param( [Parameter(mandatory = $true)] [ValidateSet('iSCSI','FC')] $arrayType, ##IpAddress/Name of the target host 
           [Parameter(mandatory = $true)] $volumeName, ##Name of the volume to be disconnected. (Volume name as in the array.)
           [Parameter(mandatory = $false)] $FCACL) ##Access control list name to which volume is added (Related to FC Array only)       
        begin{
            if (($arrayType -eq 'FC') -and ($FCACL -eq $null)){
                Write-Error "For a FC Array, the FCACL parameter cannot be null."
                return
            }
        }
        process{
            .....
            .....
        }
    }

    Danke allen für Ihre inputs und Anregungen. Ich Schätze Ihre Hilfe.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.