2012-04-05 8 views
2

Ich mache einige Skripts in PowerShell, und ich frage mich, ob es eine Möglichkeit gibt, einen Parameter "X" auf die gleiche Weise wie Parameter "-Credential" zu deklarieren, zum Beispiel im Cmdlet Get-WMIObject.Wie Parametertyp in einen anderen Objekttyp konvertiert werden

Lassen Sie mich genauer sein. Der Credential-Parameter in fast allen Cmdlets ist ein PSCredential-Objekt. Das Argument kann jedoch entweder ein PSCredential-Objekt oder ein String-Objekt mit dem Benutzernamen sein.

[CmdletBinding()] 
param ([Parameter(Mandatory = $false)] 
     [System.Management.Automation.PSCredential] 
     $Credential) 

Das Problem tritt auf, wenn eine Zeichenfolge übergeben wird. Natürlich kann eine Argumenttransformation für den Parameter nicht durchgeführt werden. Der Typ "System.String" kann nicht in einen Typ PSCrendential konvertiert werden.

Antwort

5

diesen Probieren Sie:

param(
    [System.Management.Automation.Credential()] 
    $Credential=[System.Management.Automation.PSCredential]::Empty 
) 

In Bezug auf Parameter Argument Transformation, diesen fantastischen Skript überprüfen:

http://poshcode.org/3024

+0

Dank Shay Levy. Es klappt! – nbetm

+0

Ich habe immer 'if ($ Credential.GetType(). Name -ne 'PSCredential') {$ Credential = Get-Credential $ Credential}' im Body der Funktion verwendet (casting $ Credential als [PSObject]). Ihre Lösung ist eleganter, danke! Was bewirkt das '= [System.Management.Automation.PSCredential] :: Empty? Nur "[System.Management.Automation.Credential()] $ Credential" scheint von selbst zu funktionieren - wenn Sie eine Zeichenkette angeben, erhalten Sie eine PS Credential Request-Eingabeaufforderung mit dem Feld "Benutzername", das mit der Zeichenfolge gefüllt ist. –

+0

1/2 Wenn der Credential-Parameter PSCredential lautet, können Sie keine Zeichenfolge an ihn übergeben: get-something -cred adi, Sie erhalten den Fehler 'Argumenttransformation kann nicht verarbeitet werden'. mit der 'Credential()' Transformation löst dies. Jetzt können Sie 'get-something -cred adi' ausführen und das Anmeldedaten-Dialogfeld aufrufen und mit dem Benutzernamen füllen. –

0

Wenn Sie einen Funktionsparameter mit dem Typ [T] deklarieren, können Sie beim Aufruf der Funktion ein beliebiges Objekt vom Typ [X] angeben, wobei [T] einen Einzelparameterkonstruktor hat, der den Typ [X] akzeptiert.

Mit anderen Worten, wenn Sie ein [T] aus einem [String] konstruieren können, können Sie die Funktion entweder mit einem [T] oder einem [String] aufrufen.

0

Dies ist, wie ich es getan habe. Ich erkläre die Parameter wie folgt aus:

[Parameter (Position = 2)] [object] $ Credential

Dann am Anfang des Skripts:

begin { 
     Write-Verbose -Message "Starting $($myinvocation.mycommand)" 
     write-verbose -Message "Using volume $($volume.toUpper())" 
     #convert credential to a PSCredential if a string was passed. 
     if ($credential -is [system.management.automation.psCredential]) { 
      Write-Verbose "Using PSCredential for $($credential.username)" 
     } 
     ElseIf ($Credential) { 
      Write-Verbose "Getting PSCredential for $credential" 
      $Credential=Get-Credential $credential 
     } 
    } #Begin 
1

Ein bisschen mehr Informationen:)

In PowerShell ist eine dieser Argumenttransformationen zur Verwendung mit Anmeldeinformationen enthalten. Wenn Sie also ein Skript mit einem PSCredential-Parameter schreiben, sollten Sie es wie folgt mit dem CredentialAttribute dekorieren:

param([Parameter(Mandatory = $false)] 
     [System.Management.Automation.PSCredential] 
     [System.Management.Automation.Credential()]$Credential = [System.Management.Automation.PSCredential]::Empty) 

Dass man ein wenig verwirrend ist, weil Sie das „Attribut“ Teil des Namens des Attributs wegzulassen (dh: Sie müssen nicht angeben [System.Management.Automation.CredentialAttribute()]), so bei auf den ersten Blick sieht es so aus, als würden Sie den Credential-Typ zweimal angeben. In der Praxis ist dies natürlich eine weitere Verwendung von Klammern in PowerShell. Um ein Attribut anzugeben, verwenden Sie eckige Klammern wie bei Typen, aber mit Klammern in ihnen (auch wenn das Attribut keine Parameter benötigt).

http://huddledmasses.org/more-custom-attributes-for-powershell-parameters/

Verwandte Themen