Geek School Arbeiten mit Sammlungen in PowerShell
Da PowerShell auf dem .Net Framework basiert und verschiedene andere Technologien wie WMI und CIM enthält, gibt es immer mehrere Möglichkeiten, das Gleiche zu erreichen. Kommen Sie mit uns zu diesem kurzen Beitrag, in dem wir lernen, wie Sie die beste Methode zur Erfüllung unserer Aufgaben wählen.
Lesen Sie unbedingt die vorherigen Artikel der Serie:
- Erfahren Sie, wie Sie Windows mit PowerShell automatisieren
- Verwenden von Cmdlets in PowerShell
- Informationen zum Verwenden von Objekten in PowerShell
- Lernen Sie das Formatieren, Filtern und Vergleichen in PowerShell
- Informationen zum Verwenden von Remoting in PowerShell
- Verwenden von PowerShell zum Abrufen von Computerinformationen
Und bleiben Sie die ganze Woche für den Rest der Serie dran.
Verwenden von Stapel-Cmdlets
Zu einem früheren Zeitpunkt in der Serie, als wir Sie in die Pipeline eingeführt haben, haben wir Ihnen gezeigt, wie Sie die Objekte, die ein Cmdlet ausgibt, übernehmen und als Eingabe an ein anderes Cmdlet übergeben können.
Get-Process -Name-Notizblock | Stop-Prozess
Dies würde jeden Prozess mit dem Namen "Notizblock" beenden. Sie fragen sich wahrscheinlich, wie PowerShell jede Notepad-Instanz mit einem einzigen Befehl beenden kann. Die Antwort liegt in der Hilfe des Cmdlets Stop-Process.
Hilfe Stop-Process-Full
Wenn Sie sich die letzte Codezeile im Syntaxabschnitt ansehen, können Sie feststellen, dass der InputObject-Parameter ein Objekt vom Typ Process [] akzeptiert. Wenn Sie einen Typ sehen, der von zwei eckigen Klammern gefolgt wird, bedeutet dies, dass der Parameter akzeptiert ein oder mehr des vorhergehenden Typs. In diesem Fall akzeptiert es ein oder mehrere Prozessobjekte. Technisch würden wir sagen, dass das Cmdlet InputObject einen Prozess akzeptiert Array. Wenn Sie über ein Cmdlet verfügen, das Batchvorgänge auf diese Weise unterstützt, verwenden Sie es. Dies ist Wahl Nummer eins.
WMI verwenden
WMI ist zwar nicht die beste Technologie, die aus dem Microsoft-Hauptquartier ausgeliefert werden kann, steht jedoch auf der Liste der Möglichkeiten, mit Sammlungen von Objekten zu arbeiten. Wir könnten leicht eine Liste der laufenden Prozesse von der Klasse Win32_Process erhalten, wie folgt:
Get-WmiObject -Class Win32_Process
Da die WMI-Abfrage eine eigene Art von Objekt zurückgibt, müssen Sie nach einer Methode suchen, die den Prozess anhalten kann. Daher können Sie diese Methode an Get-Member weiterleiten.
Get-WmiObject -Class Win32_Process | Get-Member
Sieht so aus, als wäre die Beendigungsmethode die am nächsten zu stoppende Sache, also muss es die sein. Um eine Methode für ein WMI-Objekt aufzurufen, leiten Sie sie einfach an Invoke-WmiMethod weiter und geben den Namen der Methode an.
Get-WmiObject -Class Win32_Process -Filter "name =" notepad.exe "" | Invoke-WmiMethod -Name Beenden
Toll, das hat den Trick gemacht. Wenn Sie in WMI einen ReturnValue von 0 erhalten, denken Sie daran, dass der Befehl erfolgreich ausgeführt wurde.
Aufzählung
Wenn Sie die anderen beiden Methoden nicht erfüllen, können Sie das gesamte Objekt auflisten und auf jedes einzelne Objekt einwirken, wenn Sie einige Objektgruppen ausführen müssen. Zuerst müssen Sie die Methode finden, die Sie zum Stoppen eines einzelnen Prozesses verwenden würden.
Get-Process | Get-Member -MemberType-Methode
Perfekt, es sieht so aus, als könnten wir die Kill-Methode verwenden und dann in ForEach-Object pfeifen, um sie alle zu töten.
Get-Process -Name-Notizblock | ForEach-Object -Process $ _. Kill ()
Hier haben wir alle Prozessobjekte, die Get-Process zurückgegeben hat, an das Cmdlet ForEach-Object übergeben. Ähnlich wie beim Where-Object-Cmdlet haben wir jedes Objekt in der Pipeline mit $ _ dargestellt, mit dem wir die Kill () -Methode aufrufen konnten. Mit all dem, was gesagt und getan wird, ist das Auflisten einer Sammlung viel langsamer als die oben genannten Methoden und sollte nur als letztes Ergebnis verwendet werden.
Zusammenfassung
Wahl eins
Get-Process -Name-Notizblock | Stop-Prozess
Wahl zwei
Get-WmiObject -Class Win32_Process -Filter "name =" notepad.exe "" | Invoke-WmiMethod -Name Beenden
Wahl drei
Get-Process -Name-Notizblock | ForEach-Object -Process $ _. Kill ()
Das ist alles für diese Zeit, Leute, bis nächste Woche für mehr PowerShell-Spaß.