11Sep
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ß.