El cmdlet ForEach-Object usa bloques de script y el descriptor $_ para el objeto de canalización actual con el fin de poder ejecutar un comando en cada objeto de la canalización. Esto se puede utilizar para realizar algunas tareas complicadas.

Una situación en la que puede resultar conveniente es cuando se manipulan datos para que sean más útiles. Por ejemplo, se puede usar la clase Win32_LogicalDisk de WMI para devolver información sobre el espacio libre en cada disco local. No obstante, los datos se devuelven en bytes, lo que dificulta su lectura:

PS> Get-WmiObject -Class Win32_LogicalDisk


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

Podemos convertir el valor de FreeSpace en megabytes si dividimos cada valor entre 1024 dos veces; tras la primera división, los datos se muestran en kilobytes y, tras la segunda, en megabytes. Puede realizar esto con un bloque de script ForEach-Object escribiendo lo siguiente:

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

Por desgracia, ahora el resultado son datos que no tienen asociadas etiquetas. Dado que las propiedades de WMI de este tipo son de sólo lectura, no puede convertir directamente FreeSpace. Si escribe esto:

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

Aparecerá un mensaje de error:

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

Podría reorganizar los datos usando algunas técnicas avanzadas, pero un método más sencillo es crear un nuevo objeto, usando Select-Object.




Tabla de contenido