2016-08-29 15 views
1

Ich schreibe eine Funktion, die eine * .CSV-Datei aktualisiert, um von einem Marionettenskript aufgenommen zu werden, das eine DNS-Zone aktualisiert. Da ich die echte .CSV-Datei nicht brechen will, habe ich eine Dummy-Datei hinzugefügt. Während ich diese Funktion entwickle, habe ich drei Parametersätze: Reset, Add und Remove. Diese Parameter überschreiben meine Dummy-Datei mit der aktuellen kanonischen .CSV-Datei, fügen einen Datensatz hinzu bzw. löschen einen Datensatz. Das Hauptskript wird niemals die Funktion aufrufen, wenn zwei oder alle drei dieser Schalter aktiv sind.Parametersätze - wie kann ich den Standard arbeiten lassen?

Hier ist, wie ich mein Skript-Parameterblock codiert haben:

function Update-DNS_Dev 
{ 
    [CmdletBinding(defaultparametersetname='Reset')] 
    [OutputType([int])] 
    Param 
    (
     [Parameter(Mandatory=$true, 
        ValueFromPipelineByPropertyName=$true, 
        Position=0, 
        ParameterSetName='Reset')] 
     [switch]$Reset, 

     [Parameter(Mandatory=$true, 
      ValueFromPipelineByPropertyName=$true, 
      Position=0, 
      ParameterSetName='Remove')] 
     [switch]$Remove, 

     [Parameter(Mandatory=$true, 
      ValueFromPipelineByPropertyName=$true, 
      Position=0, 
      ParameterSetName='Add')] 
     [switch]$Add, 

     # Name of a Dummy file 
     [Parameter(ValueFromPipelineByPropertyName=$true, 
        Position=1)] 
     [string]$DummyFile = "{0}\dPvmnames.csv" -f $DNSScratchpad, 

     [Parameter(ValueFromPipelineByPropertyName=$true, 
        ParameterSetName='Remove')] 
     [Parameter(ValueFromPipelineByPropertyName=$true, 
        ParameterSetName='Add')] 
     [string]$servername, 

     [Parameter(ValueFromPipelineByPropertyName=$true, 
        ParameterSetName='Add')] 
     [Parameter(ValueFromPipelineByPropertyName=$true, 
        ParameterSetName='Remove')] 
     [string]$domain, 

     [Parameter(ValueFromPipelineByPropertyName=$true, 
        ParameterSetName='Add')] 
     [string]$details, 

     [Parameter(ValueFromPipelineByPropertyName=$true, 
        ParameterSetName='Add')] 
     [string]$type 
    ) 
} 

Lower im Skript, verwende ich switch ($psCmdlet.ParameterSetName) die Schalter verschiedene Funktionalitäten zu verarbeiten. Wenn ich einen Get-Help Update-DNS tun, sehe ich erwartete Ausgabe:

PS> get-help Update-DNS_Dev 

NAME 
    Update-DNS_Dev 

SYNTAX 
    Update-DNS_Dev [-Reset] [[-DummyFile] <string>] [<CommonParameters>] 

    Update-DNS_Dev [-Remove] [[-DummyFile] <string>] [-servername <string>] [-domain <string>] [<CommonParameters>] 

    Update-DNS_Dev [-Add] [[-DummyFile] <string>] [-servername <string>] [-domain <string>] [-details <string>] [-type <string>] [<CommonParameters>] 

Wenn ich die Funktion und liefern den -Reset Parameter aufrufen, führt mein Skript wie erwartet, aber wenn ich es ohne Parameter aufrufen, wird mein Standard nicht wirksam und schlagen 1, $true, true oder Enter-Taste zu akzeptieren, was die Standard--Reset Parameter immer eine rote Fehlermeldung führt zu sein scheint:

PS> Update-DNS_Dev 
cmdlet Update-DNS_Dev at command pipeline position 1 
Supply values for the following parameters: 
(Type !? for Help.) 
Reset: 

Update-DNS_Dev : Cannot process argument transformation on parameter 'Reset'. 
Cannot convert value "System.String" to type "System.Management.Automation. 
SwitchParameter". Boolean parameters accept only Boolean values and numbers, 
such as $True, $False, 1 or 0. 
At line:1 char:1 
+ Update-DNS_Dev 
+ ~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidData: (:) [Update-DNS_Dev], ParameterBindingArgumentTransformationException 
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Update-DNS_Dev

Hat jemand einen Vorschlag, wie ich meine Funktion bekommen kann, die -Reset Schalter-Standard zu nehmen, wenn der Code, der die Funktion aufruft, keine Parameter liefert?

+1

"-Reset" nicht zwingend machen. – PetSerAl

Antwort

1

Während ich normalerweise [Switch] Parameter ermutigen würde, wenn sie einen Parametersatz definieren, in Ihrem Fall können Sie es nicht so haben, und wie PetSerAl sagte, müssen Sie es optional machen.

Der Grund kommt auf, was Mandatory eigentlich bedeutet. Es bedeutet nicht nur, dass es einen Wert haben muss, es bedeutet, dass der Parameter gebunden wie in, vom Anrufer geliefert werden muss. Dies ist der gleiche Grund, warum ein obligatorischer Parameter nicht mit einem Standardwert versehen werden kann.

+0

Ich dachte genau heute Morgen unter der Dusche. Sobald ich zur Arbeit kam, habe ich es getestet .... Erfolg! – Daniel

Verwandte Themen