Windows PowerShell: Erstellen von Cmdlets in Skripts

Don Jones

Einen interessanten neuen Features in Windows PowerShell-Virtual Machine Manager-Befehlsshell v2 ist die Möglichkeit, eine deutlich verbesserte Funktionen schreiben. Werden diese Funktionen im Skript vollständig geschrieben haben dieselben Funktionen wie ein “ echte ” Cmdlet in c# oder Visual Basic geschrieben und kompiliert in Visual Studio. Diese erweiterten Funktionen von (they were originally called “script cmdlets” early in the v2 development cycle) Hilfe Sie flexibleren Funktionen schreiben können Sie nahtlos zusammen mit regulären Cmdlets.

Es ist alles in der Bindung

Der Unterschied zwischen nur-Funktion und einer vollständigen Cmdlet ist, dass Cmdlets leistungsfähige Parameterbindungen unterstützen. Positionsparameter, benannte Parameter erforderlichen Parameter und sogar führen grundlegende Parameter Validierungen können – alles, indem einfach, beschreibt den Parameter der Shell. Hier ist ein Beispiel:

Zuordnen eines eigenen Module

Wie wird diese Hilfe verteilen Sie Ihre Skripts einfacher? Der zweite Typ des Moduls, für eine Skript-Modul ist die Antwort. Dies ist lediglich ein normaler Windows PowerShell-Virtual Machine Manager-Befehlsshell Skript mit Dateinamenerweiterung .psm1 statt der üblichen PS1-Dateinamenerweiterung. Versetzen in den Ordner \modules mymodule.psm1 ermöglicht es Ihnen, Importmodul MyModule gesucht ausgeführt und Ihr Skript wird ausgeführt.

Normalerweise besteht ein Skript-Modul vollständig Funktionen. D. h., wenn das Modul importiert wird, nichts tatsächlich führt, die Funktionen in der Skript-Modul in der Shell geladen werden und werden in der Shell verfügbar. Genommen Sie an, Sie verwenden ein Skript-Modul, das ungefähr folgendermaßen aussieht:

function Get-Inventory {
    [CmdletBinding()]
    param (
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string[]]$computername,
        
        [parameter(Mandatory=$false)]
        [alias("PF")]
        [switch]$pingfirst,
        
        [parameter(Mandatory=$true,Position=0)]
        [AllowEmptyString()]
        [string]$class
        
    )
    PROCESS {
    }
}

In dieser Anweisung habe ich drei Parameter deklariert:

  • Computername wird eine einzelne Zeichenfolge oder ein Array von Zeichenfolgen. Es ist obligatorisch und Pipeline Zeichenfolgeneingabe akzeptiert, d. h., wenn Sie eine Reihe von Zeichenfolgen zu leiten, Sie werden automatisch gelöscht werden in der Variablen $ Computername.
  • Pingfirst ist nicht obligatorisch, aber wenn Sie es verwenden, sollten Sie den - PF-Alias. Es wird ein wenig Eingabe speichern. Hierbei handelt es sich um einen Switch-Parameter, d. h., einen Wert nicht akzeptiert. Er ist entweder aktiviert oder deaktiviert.
  • -Klasse ist auch erforderlich, aber Sie Don ’t haben sogar geben-Klasse Parameternamen. So geben Sie ihm den entsprechenden Wert als Wert für die erste Position beim Ausführen der Funktion. Obwohl dies erforderlich ist, akzeptiert er eine leere Zeichenfolge.

Es gibt viele weitere Attribute – und eine Menge Beispiele – in der Onlinehilfe. Helfen About_Functions_Advanced_Parameters Sie alle ausgeführt werden.

Zugriff auf allgemeine Parameter

Die Shell definiert mehrere allgemeine Parameter, die von allen Cmdlets gemeinsam genutzt. Eine davon ist - ausführlich, die ein Cmdlet zur Ausgabe von Informationen als gewöhnlich, was es tut mitteilen konzipiert ist. Die folgenden Funktionsdefinition führt jedoch zu einer Windows PowerShell-Virtual Machine Manager-Befehlsshell:

function Test-Something {
    [CmdletBinding()]
    param (
        [switch]$verbose
    )
    PROCESS {
    }
}

Der ist, dass Sie einer der allgemeinen Parameter wie - re-define können nicht werden ausführliche. Wie kann man feststellen, wenn die Funktion mit - verbose oder nicht ausgeführt wurde? Nun, erweist es unnötig. Windows PowerShell-Virtual Machine Manager-Befehlsshell dient zum Verfolgen der es für Sie. Rufen Sie einfach Write-Verbose, und diese Aufrufe Windows PowerShell-Virtual Machine Manager-Befehlsshell ignorieren, wenn - verbose war nicht verwendet:

function Test-Something {
    PROCESS {
        Write-Verbose "Starting cmdlet"
    }
}

test-something –verbose

Überprüfen der Auswirkungen

Ein weiteres Paar allgemeine Parameter ist - Whatif und - Bestätigung. Alle Cmdlets, die einige Arten von Änderungen an der Windows PowerShell-Virtual Machine Manager-Befehlsshell sollte die erkennen. Sie bieten Ihnen die Möglichkeit, das Cmdlet anzeigen, wie es normalerweise der Fall wäre (-Whatif), oder lassen Sie einzeln bestätigen jeder Aktion (- Bestätigung). Zusammen, diese Parameter werden als ShouldProcess und Sie können eine Funktion, die unterstützt werden, wie folgt deklarieren:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="Medium"
    )]
    PROCESS {
    }
}

Diese Deklaration können beide - Whatif und - als Parameter für Ihre Funktion zu bestätigen. Es gibt außerdem an, dass die Funktion eine "Mittel" Wirkungsgrads auf das Betriebssystem hat. Es gibt keine strengen Richtlinien für die Bedeutung von "Medium", würde ich vorstellen, es ist etwas kleiner als die Wahrscheinlichkeit für insgesamt Notfall. Der eigentliche Trick dabei ist, dass die Shell die Variable „ $ ConfirmPreference auf "Hoch standardmäßig" Wenn ein Cmdlet Auswirkungen geringer als $-ConfirmPreference ist, das Cmdlet, sofern - ohne Bestätigung ausgeführt werden Whatif oder - Bestätigung angegeben sind.

Wenn das Cmdlet Auswirkungen gleich oder höher als $ ConfirmPreference, wird bei jeder Ausführung des Cmdlets er fungiert als ob Sie angegeben wäre - bestätigen, auch wenn dies vergessen. Deshalb Wenn Ihre Funktion etwas wirklich gefährlichen von angeben einer ConfirmImpact = "Hoch", damit Ihr Cmdlet immer Bestätigung angefordert wird. Die anderen Optionen sind "None" und "Low".

Keiner der integrierten Hilfe von der Shell tatsächlich zeigt, wie Sie zur Bestätigung aufgefordert, und es nicht automatisch. Die Hilfe, die Sie in der MSDN Onlinehilfe, die richtet sich an Entwickler Windows PowerShell-Virtual Machine Manager-Befehlsshell .NET Framework und die Shell-Skriptsprache nicht bei allen verweisen verwiesen. So werde ich Ihnen hier angezeigt:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="High"
    )]
    Param ($param1)
    PROCESS {
        if ($pscmdlet.ShouldProcess($param1)) {
            Write "Deleting..."
        }
    }
}

Delete-Things "organizationalunit"

Pscmdlet $ ist eine vordefinierte Variable können Sie innerhalb des Skriptblocks PROCESS Windows PowerShell-Virtual Machine Manager-Befehlsshell Cmdlet-Level-Funktionalität, einschließlich der ShouldProcess-Methode. Sie übergeben, was Sie gerade ändern, eine Beschreibung und die Shell kümmern sich um die tatsächliche Bestätigung anzeigen oder “ wenn ” angezeigt wird.

Wenn ShouldProcess gibt $ True sind, werden Sie den Vorgang fortsetzen können. Wenn Sie gibt $ False, und Sie sollten keine ist alles, was Sie tun würden. Wenn Sie über die Variable „ $ Pscmdlet kennen, ist die Vorstellung von Dokumenten diese MSDN-Entwickler Erstellen einfacher. Sie genau beschreiben die verschiedenen Möglichkeiten zum Verwenden Sie ShouldProcess und deren Zubehör, wie ShouldContinue.

Hilfe! Hilfe! Hilfe!

Vergessen Sie nicht, funktioniert – erweiterte sogar diejenigen – kann über eine eigene integrierte Hilfe speziell formatierte Kommentare enthalten, wie in meinem März 2010 Spalte beschrieben. In der Regel ich Auflisten der Kommentar-basierte Hilfe zuerst, dann die Anweisung CmdletBinding dann meine Parameter und der PROCESS {}, {} BEGIN und END {} Scriptblocks. Immer empfiehlt sich, die Hilfe in Ihrer Funktionen enthalten ist – Sie nie wissen, wer von Nutzen sein könnten.

Wenn Sie geschrieben haben Pipeline vor (auch aufgerufene “ Filtern Funktionen ”) funktioniert, dann wissen Sie bereits alle anderen müssen Sie wissen, Schreiben Sie ein “ Skript Cmdlet ”. Der Skriptblock PROCESS {} wird Code geht, und es wird einmal ausgeführt, für jedes Objekt in Ihrem Cmdlet geleitet. Alles Weitere Informationen zu dieser erweiterten Funktionen ist auch genau wie Gegenstücke in etwas einfacher.

Windows PowerShell-Virtual Machine Manager-Befehlsshell v2 ist jetzt verfügbar

Obwohl es mit Windows PowerShell-Virtual Machine Manager-Befehlsshell Server 2008 R2 und Windows PowerShell-Virtual Machine Manager-Befehlsshell 7, Windows PowerShell-Virtual Machine Manager-Befehlsshell v2 vorinstalliert geliefert, und seine zugehörigen Management Framework-Komponenten – ist jetzt unter XP Windows PowerShell-Virtual Machine Manager-Befehlsshell, Windows PowerShell-Virtual Machine Manager-Befehlsshell Server 2003 Windows PowerShell-Virtual Machine Manager-Befehlsshell Vista und Windows PowerShell-Virtual Machine Manager-Befehlsshell Server 2008 verfügbar. Besuchen Sie die support.microsoft.com/kb/968929 den Download-Link für beliebige Betriebssystem zu erhalten, die Sie verwenden. Dies sollte mit Ihren Skripts v1 kompatibel sein, und alle meine zukünftigen Spalten geht davon aus, dass Sie 2.0 verwenden.

Ein Bereich von Benutzergruppen

Das Team Windows PowerShell-Virtual Machine Manager-Befehlsshell prides mit sich selbst auf die Windows PowerShell-Virtual Machine Manager-Befehlsshell nützlich, um eine Vielzahl von Zielgruppen mit unterschiedlicher Spielerfahrung. Erweiterte Funktionen sind definitiv ein Beispiel für ein Element, das nur eine Erweiterte -Zielgruppe hilfreich.

Wenn Sie gerade in die Shell Einstieg sind und um sich selbst zum Ausführen von Hilfe erinnern, sind erweiterte Funktionen wahrscheinlich noch deaktiviert in der Zukunft. Sie können die Shell erfolgreich verwenden, ohne jemals eine erweiterte Funktion zu schreiben. Nach dem Starten Sie erweiterte Abrufen und wiederverwendbare Komponenten schreiben, werden Sie feststellen, dass Erweiterte Funktionen hervorragend dazu sind.

Den Blogbeitrag hier ist ein gutes Beispiel dafür: Er beginnt mit einem einfachen Befehl, die eine wichtige Aufgabe erledigt – etwa alle Administratoren schreiben kann. Dann der Autor allmählich Erweitert des Befehls-Funktionalität in einer Funktion und anschließend eine Filterfunktion und schließlich eine erweiterte Funktion angezeigt, wie die Shell als Ihren Anforderungen skalieren kann und Fähigkeiten vergrößern.

Don Jones ist ein Gründer von Concentrated Technology und Antworten andere Technologien und Windows PowerShell-Virtual Machine Manager-Befehlsshell Fragen ConcentratedTech.com. Er ist außerdem Autor für Nexus.Realtimepublishers.com, wodurch viele seinen Büchern als kostenloser elektronischer Editionen verfügbar.

Verwandter Inhalt

·      Windows PowerShell: PowerShell und Active Directory

·      Windows PowerShell: Filter links, Format rechts

·      Windows PowerShell: Bleiben Sie sitzen