11Sep

Geek School: Arbeiten mit Sammlungen in PowerShell

Da PowerShell auf dem. NET Framework basiert und verschiedene andere Technologien wie WMI und CIM integriert, gibt es immer mehr als eine Möglichkeit, dasselbe zu erreichen. Kommen Sie zu uns für diesen kurzen Beitrag, wo wir lernen, die beste Methode zu wählen, um unsere Aufgaben zu erfüllen.

Lesen Sie die vorherigen Artikel der Serie:

  • Erfahren Sie, wie Sie Windows mit PowerShell automatisieren
  • Lernen mit Cmdlets in PowerShell
  • Lernen Verwenden von Objekten in PowerShell
  • Lernen Formatieren, Filtern und Vergleichen in PowerShell
  • Lernen Sie Remoting inPowerShell
  • Verwenden von PowerShell zum Abrufen von Computerinformationen

Und bleiben Sie die ganze Woche auf den Rest der Serie dran.

Verwenden von Batch-Cmdlets

Zuvor, als wir Ihnen die Pipeline vorgestellt haben, haben wir Ihnen gezeigt, wie Sie die Objekte, die ein Cmdlet ausgibt, als Eingabe an ein anderes Cmdlet übergeben. Verwenden Sie dazu Folgendes:

Get-Process -Name Notizblock |Stop-Process

Dies würde jeden Prozess mit dem Namen "notepad" beenden. Aber Sie fragen sich wahrscheinlich, wie PowerShell jede Instanz von Notepad mit einem einzigen Befehl beenden kann. Die Antwort liegt in der Hilfe des Cmdlets Stop-Process.

help Stop-Prozess - Full

Wenn Sie sich die letzte Codezeile im Syntaxabschnitt ansehen, können Sie sehen, dass der InputObject-Parameter ein Objekt vom Typ Process [] akzeptiert, und immer wenn Sie einen Typ gefolgt von zwei eckigen Klammern sehendass es bedeutet, dass der Parameter einen oder mehrere des vorhergehenden Typs akzeptiert. In diesem Fall akzeptiert es ein oder mehrere Prozessobjekte. Technisch würden wir sagen, dass das InputObject-Cmdlet ein Prozess--Array akzeptiert. Wenn Sie auf diese Weise ein Cmdlet verwenden, das Batch-Operationen unterstützt, verwenden Sie es. Das ist Wahl Nummer eins.

Verwenden von WMI

Obwohl WMI nicht die beste Technologie ist, die aus dem Microsoft-Hauptquartier geliefert wird, kommt es an zweiter Stelle in der Liste zum Arbeiten mit Objektsammlungen. Wir könnten leicht eine Liste laufender Prozesse aus der Win32_Process-Klasse erhalten:

Get-WmiObject -Klasse Win32_Process

Da die WMI-Abfrage ihren eigenen Objekttyp zurückgibt, müssen Sie nach einer Methode suchen, die den Prozess stoppen kannLassen Sie das zu Get-Member leiten.

Get-WmiObject -Klasse Win32_Process |Get-Member

Sieht so aus, als wäre die Methode zum Beenden die Methode, die am nächsten kommt, also muss es die eine sein. Um eine Methode für ein WMI-Objekt aufzurufen, leiten Sie sie einfach an Invoke-WmiMethod und geben den Namen der Methode an.

Get-WmiObject -Klasse Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Beenden

Großartig, das hat den Trick gemacht. Wenn Sie in WMI einen ReturnValue von 0 erhalten, denken Sie daran, dass der Befehl erfolgreich ausgeführt wurde.

-Enumeration

Wenn die beiden anderen Methoden fehlschlagen, können Sie das gesamte Objekt aufzählen und auf jedes einzelne Objekt zugreifen, wenn Sie etwas mit einer Reihe von Objekten tun müssen. Zuerst müssen Sie die Methode finden, die Sie verwenden würden, um einen einzelnen Prozess zu stoppen.

Get-Prozess |Get-Member -MemberType-Methode

Perfekt, es sieht so aus, als könnten wir die Kill-Methode verwenden und dann in ForEach-Object pipen, 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, übernommen und an das Cmdlet ForEach-Object übergeben.Ähnlich wie das Cmdlet Where-Object haben wir jedes Objekt in der Pipeline mit $ _ dargestellt, das wir mit der Methode Kill() aufrufen konnten. Nach all dem Gesagten ist das Aufzählen einer Sammlung viel langsamer als die obigen Methoden und sollte nur als letztes Ergebnis verwendet werden.

Zusammenfassung

Auswahl Ein

Get-Process -Name Notizblock |Stop-Process

Wahl Zwei

Get-WmiObject -Klasse Win32_Process -Filter "name = 'notepad.exe'" |Invoke-WmiMethod -Name Beendet

Auswahl Drei

Get-Process -Name Notizblock |ForEach-Object -Process{ $ _. Kill()}

Das ist alles für diese Zeit Leute, wir sehen uns nächste Woche für mehr PowerShell Spaß.