Erstellen eines Cmdlet ohne Parameter
In diesem Abschnitt wird beschrieben, wie Sie ein Cmdlet erstellen, das Informationen vom lokalen Computer ohne Verwendung von Parametern abruft und die Informationen dann in die Pipeline schreibt. Das hier beschriebene Cmdlet ist Get-Proc Cmdlet, das Informationen zu den Prozessen des lokalen Computers abruft und diese Informationen dann in der Befehlszeile anzeigt.
Hinweis
Beachten Sie, dass beim Schreiben von Cmdlets die Windows PowerShell®-Verweisassemblys auf den Datenträger heruntergeladen werden (standardmäßig unter C:\Programme\Reference Assemblies\Microsoft\WindowsPowerShell\v1.0). Sie werden nicht im globalen Assemblycache (GAC) installiert.
Benennen des Cmdlets
Ein Cmdlet-Name besteht aus einem Verb, das die Aktion angibt, die das Cmdlet ausgeführt hat, und einem Substantiv, das die Elemente angibt, für die das Cmdlet fungiert. Da dieses Get-Proc-Beispiel-Cmdlet Prozessobjekte abruft, verwendet es das Verb "Get", das durch die System.Management.Automation.Verbscommon-Enumeration definiert ist, und das Substantiv "Proc", um anzugeben, dass das Cmdlet mit Prozesselementen funktioniert.
Verwenden Sie beim Benennen von Cmdlets keines der folgenden Zeichen: # , () {} [] & - /\ $ ; : " '<> | ? @ ` .
Auswählen eines Nomens
Sie sollten ein spezifisches Nomen auswählen. Es ist am besten, ein singulares Nomen mit dem Präfix einer verkürzten Version des Produktnamens zu verwenden. Ein Beispiel für einen Cmdlet-Namen dieses Typs ist " Get-SQLServer
".
Auswählen eines Verbs
Sie sollten ein Verb aus dem Satz genehmigter Cmdlet-Verbnamen verwenden. Weitere Informationen zu den genehmigten Cmdlet-Verben finden Sie unter Cmdlet Verb Names.
Definieren der Cmdlet-Klasse
Nachdem Sie einen Cmdlet-Namen ausgewählt haben, definieren Sie eine .NET-Klasse, um das Cmdlet zu implementieren. Dies ist die Klassendefinition für dieses Beispiel-Get-Proc Cmdlet:
[Cmdlet(VerbsCommon.Get, "Proc")]
public class GetProcCommand : Cmdlet
<Cmdlet(VerbsCommon.Get, "Proc")> _
Public Class GetProcCommand
Inherits Cmdlet
Beachten Sie, dass vor der Klassendefinition das Attribut System.Management.Automation.CmdletAttribute mit der Syntax verwendet wird, um diese Klasse als [Cmdlet(verb, noun, ...)]
Cmdlet zu identifizieren. Dies ist das einzige erforderliche Attribut für alle Cmdlets, und es ermöglicht der Windows PowerShell Runtime, sie ordnungsgemäß auf aufruft. Sie können Attributschlüsselwörter festlegen, um die Klasse bei Bedarf weiter zu deklarieren. Beachten Sie, dass die Attributdeklaration für unsere GetProcCommand-Beispielklasse nur das Nomen und die Verbnamen für das Get-Proc deklariert.
Hinweis
Für alle Windows PowerShell Attributklassen entsprechen die Schlüsselwörter, die Sie festlegen können, den Eigenschaften der Attributklasse.
Wenn Sie die Klasse des Cmdlets benennen, ist es eine bewährte Methode, den Cmdlet-Namen im Klassennamen widerzubenennen. Verwenden Sie hierzu das Formular "VerbNounCommand", und ersetzen Sie "Verb" und "Nomen" durch das verb und nomen, das im Cmdlet-Namen verwendet wird. Wie in der vorherigen Klassendefinition gezeigt, definiert das Get-Proc-Beispiel-Cmdlet eine Klasse namens GetProcCommand, die von der Basisklasse System.Management.Automation.Cmdlet abstammt.
Wichtig
Wenn Sie ein Cmdlet definieren möchten, das direkt auf die Windows PowerShell-Runtime zutritt, sollte Ihre .NET-Klasse von der System.Management.Automation.PSCmdlet-Basisklasse ableiten. Weitere Informationen zu dieser Klasse finden Sie unter Erstellen eines Cmdlets, das Parametersätze definiert.
Hinweis
Die Klasse für ein Cmdlet muss explizit als öffentlich gekennzeichnet werden. Klassen, die nicht als öffentlich markiert sind, werden standardmäßig auf intern festgelegt und werden von der Windows PowerShell gefunden.
Windows PowerShell verwendet den Microsoft.PowerShell.Commands-Namespace für die Cmdlet-Klassen. Es wird empfohlen, Ihre Cmdlet-Klassen in einem Commands-Namespace Ihres API-Namespace zu platzieren, z. B. xxx.PS.Commands.
Überschreiben einer Eingabeverarbeitungsmethode
Die System.Management.Automation.Cmdlet-Klasse bietet drei Hauptmethoden für die Eingabeverarbeitung, von denen ihr Cmdlet mindestens eine außer Kraft setzen muss. Weitere Informationen zum Windows PowerShell von Datensätzen finden Sie unter Funktionsweise Windows PowerShell .
Für alle Eingabetypen ruft die Windows PowerShell Runtime System.Management.Automation.Cmdlet.BeginProcessing auf, um die Verarbeitung zu aktivieren. Wenn Ihr Cmdlet vorverarbeitet oder eingerichtet werden muss, kann dies durch Überschreiben dieser Methode ausgeführt werden.
Hinweis
Windows PowerShell verwendet den Begriff "Datensatz", um den Satz von Parameterwerten zu beschreiben, der beim Aufgerufen eines Cmdlets angegeben wird.
Wenn Ihr Cmdlet Pipelineeingaben akzeptiert, muss es die System.Management.Automation.Cmdlet.ProcessRecord-Methode und optional die System.Management.Automation.Cmdlet.EndProcessing-Methode überschreiben. Beispielsweise kann ein Cmdlet beide Methoden überschreiben, wenn es alle Eingaben mit System.Management.Automation.Cmdlet.ProcessRecord sammelt und dann wie das Cmdlet die Eingabe als Ganzes und nicht mit einem Element gleichzeitig Sort-Object
verwendet.
Wenn Ihr Cmdlet keine Pipelineeingaben übernimmt, sollte es die System.Management.Automation.Cmdlet.EndProcessing-Methode überschreiben. Beachten Sie, dass diese Methode häufig statt System.Management.Automation.Cmdlet.BeginProcessing verwendet wird, wenn das Cmdlet nicht gleichzeitig mit einem Element arbeiten kann, wie es bei einem Sortier-Cmdlet der Fall ist.
Da dieses Get-Proc-Beispiel-Cmdlet Pipelineeingaben empfangen muss, überschreibt es die System.Management.Automation.Cmdlet.ProcessRecord-Methode und verwendet die Standardimplementierungen für System.Management.Automation.Cmdlet.BeginProcessing und System.Management.Automation.Cmdlet.EndProcessing. Die System.Management.Automation.Cmdlet.ProcessRecord-Überschreibung ruft Prozesse ab und schreibt sie mithilfe der System.Management.Automation.Cmdlet.WriteObject-Methode in die Befehlszeile.
protected override void ProcessRecord()
{
// Get the current processes
Process[] processes = Process.GetProcesses();
// Write the processes to the pipeline making them available
// to the next cmdlet. The second parameter of this call tells
// PowerShell to enumerate the array, and send one process at a
// time to the pipeline.
WriteObject(processes, true);
}
Protected Overrides Sub ProcessRecord()
'/ Get the current processes.
Dim processes As Process()
processes = Process.GetProcesses()
'/ Write the processes to the pipeline making them available
'/ to the next cmdlet. The second parameter of this call tells
'/ PowerShell to enumerate the array, and send one process at a
'/ time to the pipeline.
WriteObject(processes, True)
End Sub 'ProcessRecord
Dinge, die Sie sich über die Eingabeverarbeitung merken sollten
Die Standardquelle für die Eingabe ist ein explizites Objekt (z. B. eine Zeichenfolge), das vom Benutzer in der Befehlszeile bereitgestellt wird. Weitere Informationen finden Sie unter Erstellen eines Cmdlets zum Verarbeiten der Befehlszeileneingabe.
Eine Eingabeverarbeitungsmethode kann auch Eingaben aus dem Ausgabeobjekt eines Upstream-Cmdlets in der Pipeline empfangen. Weitere Informationen finden Sie unter Erstellen eines Cmdlets zum Verarbeiten von Pipelineeingaben. Beachten Sie, dass Ihr Cmdlet Eingaben aus einer Kombination aus Befehlszeilen- und Pipelinequellen empfangen kann.
Das Downstream-Cmdlet gibt möglicherweise lange oder gar nicht zurück. Aus diesem Grund sollte die Eingabeverarbeitungsmethode in Ihrem Cmdlet keine Sperren während Aufrufen von System.Management.Automation.Cmdlet.WriteObjecthalten, insbesondere sperren, für die der Bereich über die Cmdlet-Instanz hinaus reicht.
Wichtig
Cmdlets sollten nie System.Console.Writeline* oder deren Entsprechung aufrufen.
- Ihr Cmdlet verfügt möglicherweise über Objektvariablen, die nach Abschluss der Verarbeitung bereinigt werden müssen (z. B. wenn es ein Dateihand handle in der System.Management.Automation.Cmdlet.BeginProcessing-Methode öffnet und das Handle für die Verwendung durch System.Management.Automation.Cmdlet.ProcessRecordgeöffnet hält). Beachten Sie, dass die Windows PowerShell Runtime nicht immer die System.Management.Automation.Cmdlet.EndProcessing-Methode aufruft, die die Objektbereinigung durchführen sollte.
Beispielsweise wird System.Management.Automation.Cmdlet.EndProcessing möglicherweise nicht aufgerufen, wenn das Cmdlet während des Vorgangs abgebrochen wird oder wenn in einem Teil des Cmdlets ein Abbruchfehler auftritt. Daher sollte ein Cmdlet, das eine Objektbereinigung erfordert, das vollständige System.IDisposable-Muster implementieren, einschließlich des Finalizers, damit die Runtime am Ende der Verarbeitung sowohl System.Management.Automation.Cmdlet.EndProcessing als auch System.IDisposable.Dispose* aufrufen kann.
Codebeispiel
Den vollständigen C#-Beispielcode finden Sie unter GetProcessSample01-Beispiel.
Definieren von Objekttypen und Formatierung
Windows PowerShell übergibt Informationen zwischen Cmdlets mithilfe von .NET-Objekten. Folglich muss ein Cmdlet möglicherweise seinen eigenen Typ definieren, oder das Cmdlet muss möglicherweise einen vorhandenen Typ erweitern, der von einem anderen Cmdlet bereitgestellt wird. Weitere Informationen zum Definieren neuer Typen oder zum Erweitern vorhandener Typen finden Sie unter Erweitern von Objekttypen und Formatieren von.
Erstellen des Cmdlets
Nach der Implementierung eines Cmdlets müssen Sie es über Windows PowerShell ein Windows PowerShell-Snap-In registrieren. Weitere Informationen zum Registrieren von Cmdlets finden Sie unter Registrieren von Cmdlets, Anbietern und Hostanwendungen.
Testen des Cmdlets
Wenn Ihr Cmdlet bei Windows PowerShell wurde, können Sie es testen, indem Sie es in der Befehlszeile ausführen. Der Code für das Get-Proc-Beispiel-Cmdlet ist klein, verwendet jedoch weiterhin die Windows PowerShell-Runtime und ein vorhandenes .NET-Objekt, das ausreicht, um es nützlich zu machen. Wir testen sie, um besser zu verstehen, Get-Proc und wie ihre Ausgabe verwendet werden kann. Weitere Informationen zur Verwendung von Cmdlets über die Befehlszeile finden Sie unter Erste Schritte mit Windows PowerShell.
Starten Windows PowerShell, und erhalten Sie die aktuellen Prozesse, die auf dem Computer ausgeführt werden.
get-proc
Die folgende Ausgabe wird angezeigt.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 33 0.03 3816 lg 27 2 560 1920 24 0.01 1768 TpScrex ...
Weisen Sie den Cmdlet-Ergebnissen zur einfacheren Bearbeitung eine Variable zu.
$p=get-proc
Gibt die Anzahl der Prozesse an.
$p.length
Die folgende Ausgabe wird angezeigt.
63
Ruft einen bestimmten Prozess ab.
$p[6]
Die folgende Ausgabe wird angezeigt.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32
Hier erhalten Sie die Startzeit dieses Prozesses.
$p[6].starttime
Die folgende Ausgabe wird angezeigt.
Tuesday, July 26, 2005 9:34:15 AM
$p[6].starttime.dayofyear
207
Sie können die Prozesse, für die die Handleanzahl größer als 500 ist, und das Ergebnis sortieren.
$p | Where-Object {$_.HandleCount -gt 500 } | Sort-Object HandleCount
Die folgende Ausgabe wird angezeigt.
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 440 393.56 3300 WINWORD 791 71 7412 4540 59 3.31 492 winlogon ...
Verwenden Sie das
Get-Member
Cmdlet , um die für jeden Prozess verfügbaren Eigenschaften auflisten.$p | Get-Member -MemberType property
TypeName: System.Diagnostics.Process
Die folgende Ausgabe wird angezeigt.
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer Conta... EnableRaisingEvents Property System.Boolean EnableRaisingEvents {ge... ...
Weitere Informationen
Erstellen eines Cmdlets zum Verarbeiten von Befehlszeileneingaben
Erstellen eines Cmdlets zum Verarbeiten von Pipelineeingaben
Erstellen eines Windows PowerShell Cmdlets
Erweitern von Objekttypen und Formatierung
Funktionsweise Windows PowerShell