Een taak herhalen voor meerdere objecten (ForEach-Object)Repeating a Task for Multiple Objects (ForEach-Object)

De ForEach-Object cmdlet maakt gebruik van scriptblokken en de $ descriptor voor de huidige pipeline-object waarmee u een opdracht uitvoeren op elk object in de pijplijn.The ForEach-Object cmdlet uses script blocks and the $ descriptor for the current pipeline object to let you run a command on each object in the pipeline. Dit kan worden gebruikt voor een aantal complexe taken uitvoeren.This can be used to perform some complicated tasks.

Een situatie waarin dit kan handig zijn met het bewerken van de gegevens zodat nuttiger.One situation where this can be useful is manipulating data to make it more useful. De Win32_LogicalDisk-klasse van WMI kan bijvoorbeeld worden gebruikt om informatie van de vrije ruimte voor elke lokale schijf te retourneren.For example, the Win32_LogicalDisk class from WMI can be used to return free space information for each local disk. De gegevens worden geretourneerd in termen van bytes, waardoor het moeilijk te lezen:The data is returned in terms of bytes, however, which makes it difficult to read:

PS> Get-WmiObject -Class Win32_LogicalDisk

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

We kunnen de waarde FreeSpace omzetten in megabytes door elke waarde te delen door 1024 tweemaal te gebruiken. na de eerste deling worden de gegevens zich in kilobytes en na het tweede getal is in megabytes.We can convert the FreeSpace value to megabytes by dividing each value by 1024 twice; after the first division, the data is in kilobytes, and after the second division it is megabytes. U kunt dit doen in een scriptblok ForEach-Object te typen:You can do that in a ForEach-Object script block by typing:

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

De uitvoer is nu gegevens zonder bijbehorende label.Unfortunately, the output is now data with no associated label. Omdat WMI-eigenschappen zoals deze alleen-lezen zijn, kunt u niet rechtstreeks FreeSpace converteren.Because WMI properties such as this are read-only, you cannot directly convert FreeSpace. Als u dit typt:If you type this:

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

U er een foutbericht weergegeven:You get an error message:

"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}

U kunt de gegevens opnieuw indelen met behulp van sommige geavanceerde technieken, maar het eenvoudiger is voor het maken van een nieuw object met behulp van Select-Object.You could reorganize the data by using some advanced techniques, but a simpler approach is to create a new object, by using Select-Object.