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?
"-Reset" nicht zwingend machen. – PetSerAl