Das Cmdlet ForEach-Object verwendet Skriptblöcke und den Deskriptor "$_" für das aktuelle Pipelineobjekt, sodass Sie für jedes Objekt in der Pipeline einen Befehl ausführen können. Auf diese Weise können komplexe Aufgaben ausgeführt werden.

Beispielsweise können auf diese Weise Daten zur besseren Weiterverarbeitung geändert werden. So können etwa mit der Win32_LogicalDisk-WMI-Klasse Informationen über freien Speicherplatz für alle lokalen Festplatten zurückgegeben werden. Diese Informationen sind aufgrund der verwendeten Einheit Byte jedoch nicht ganz leicht zu erkennen:

PS> Get-WmiObject -Class Win32_LogicalDisk


DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 50665070592
Size         : 203912880128
VolumeName   : Local Disk

Aus diesem Grund wird der Wert von "FreeSpace" durch 1024 geteilt, um ihn in Kilobytes umzurechnen; eine weitere Division dieses Werts durch 1024 ergibt den Wert in Megabytes. Dieser Vorgang kann in einem ForEach-Object-Skriptblock mit folgender Eingabe ausgeführt werden:

Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0}
48318.01171875

Leider handelt es sich bei der Ausgabe nun um Daten ohne zugeordnete Bezeichnung. Da solche WMI-Eigenschaften schreibgeschützt sind, kann FreeSpace nicht direkt konvertiert werden. Geben Sie Folgendes ein:

Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0}

Die folgende Fehlermeldung wird angezeigt:

"FreeSpace" is a ReadOnly property.
At line:1 char:70
+ Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.F <<<< r
eeSpace = ($_.FreeSpace)/1024.0/1024.0}

Sie könnten die Daten zwar mit ausgefeilten Verfahren neu organisieren, jedoch ist es einfacher, mit Select-Object ein neues Objekt zu erstellen.




Inhaltsverzeichnis