Powtarzanie zadania dla wielu obiektów (ForEach-Object)Repeating a Task for Multiple Objects (ForEach-Object)

ForEach-Object polecenie cmdlet używa Bloki skryptu i $_ deskryptora dla bieżącego obiektu potoku umożliwić, możesz uruchomić polecenie dla każdego obiektu w potoku.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. Może to służyć do wykonania niektórych zadań skomplikowane.This can be used to perform some complicated tasks.

Jedna sytuacja, w których może to być przydatne jest manipulowanie danymi, aby zwiększyć jej użyteczność.One situation where this can be useful is manipulating data to make it more useful. Na przykład Klasa Win32_LogicalDisk WMI może służyć do zwracania informacji wolnego miejsca dla każdego dysku lokalnego.For example, the Win32_LogicalDisk class from WMI can be used to return free space information for each local disk. Dane są zwracane się pod względem bajtów, ale, co czyni go trudno odczytać: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

Możemy przekonwertować wartości FreeSpace megabajtów przez podzielenie każdej wartości przez 1024 dwukrotnie; Po wykonaniu dzielenia pierwszego dane znajdują się w kilobajtach, a po wykonaniu dzielenia drugi jest w megabajtach.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. Możesz to zrobić w bloku skryptu ForEach-Object, wpisując: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

Niestety dane wyjściowe są teraz danych bez skojarzonych etykiety.Unfortunately, the output is now data with no associated label. Ponieważ właściwości usługi WMI, takie jak to tylko do odczytu, nie można bezpośrednio przekonwertować FreeSpace.Because WMI properties such as this are read-only, you cannot directly convert FreeSpace. Jeśli wpiszesz to:If you type this:

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

Otrzymasz komunikat o błędzie: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}

Dane można uporządkować przy użyciu kilka zaawansowanych technik, ale jest prostszej metody, aby utworzyć nowy obiekt, za pomocą 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.