PowerShell und WMI, Teil 2

Ein erster Vergleich

Vergleicht man VBScript und die PowerShell, wird deutlich, dass die beiden Ansätze doch recht ähnlich aussehen – zumindest solange man keine spezielleren Funktionen wie eben die Filterung nutzen möchte. Ein Standardskript für die Abfrage auf WMI hat in VBScript ungefähr die folgende Form, in diesem Fall für eine Liste von Diensten mit ihrem Zustand:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" &
strComputer &"\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * From
Win32_Service")
For Each objItem in colItems
Wscript.Echo objItem.Name, objItem.State
Next

Das gleiche Ergebnis lässt sich bei der PowerShell etwas einfacher erreichen, wie das folgende, minimal kürzere Skript deutlich macht.

$strComputer = "."
$colItems = get-wmiobject -class "Win32_Service" -
namespace "root\cimv2" -computername $strComputer
foreach ($objItem in $colItems) {
write-host $objItem.Name, $objItem.State
}

In beiden Fällen wird zunächst eine Variable definiert, über die der Fokus auf das lokale System gesetzt wird. Anschließend erfolgt eine Abfrage. Bei VBScript sind dazu zwei Schritte erforderlich, weil man zunächst auf WMI zugreifen und anschließend eine Abfrage durchführen muss. Bei der PowerShell läuft das in einem Schritt. Hier werden bei dem bereits bekannten Cmdlet getwmiobject nur Parameter angegeben, in diesem Fall die Klasse, der Namespace und der Computername. Die beiden letztgenannten Parameter sind allerdings Standardwerte, auf die man daher auch hätte verzichten können.

Das Ergebnis wird in beiden Fällen in eine Variable gespeichert, die mit einer weiteren Anweisung verarbeitet wird. Bei PowerShell wird also mal nicht mit dem Piping gearbeitet. In beiden Fällen wird eine Schleife durchlaufen, in der eine Ausgabe der Informationen erfolgt. Bis auf die etwas unterschiedliche Syntax ist der Ansatz gleich. Die beiden Beispiele zeigen, dass es in einfacheren Fällen keine großen Unterschiede zwischen der Nutzung von VBScript und der PowerShell gibt. Es gibt aber für beide Ansätze des Scripting gute Gründe.

So ist es beispielsweise relativ einfach, mit VBScript auch Office-Anwendungen anzubinden und sie zu steuern. Das liegt ganz einfach daran, dass man in beiden Fällen mit der gleichen Programmiersprache und einem ähnlichen Objektmodell arbeitet. Bei Verwendung der PowerShell liegen die Vorteile dagegen darin, dass man die Ergebnisse beispielsweise einfacher filtern und sortieren kann. Es ist also nicht so, dass eine Sprache generell besser und die andere weniger gut geeignet wäre. Entscheidend ist immer, was man erreichen möchte.