Il cmdlet ForEach-Object utilizza blocchi di script e il descrittore $_ dell'oggetto pipeline corrente per consentire l'esecuzione di un comando su ogni oggetto della pipeline. Può pertanto essere utilizzato per eseguire alcune attività complesse.

Una situazione in cui può risultare utile è quella in cui i dati vengono modificati per renderli più utili. È ad esempio possibile utilizzare la classe Win32_LogicalDisk di WMI per restituire le informazioni sullo spazio disponibile per ciascun disco locale. I dati restituiti sono espressi in byte e pertanto difficili da leggere:

PS> Get-WmiObject -Class Win32_LogicalDisk


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

È quindi possibile convertire il valore di FreeSpace in megabyte dividendo due volte ciascun valore per 1024. Dopo la prima divisione i dati saranno infatti espressi in kilobyte, mentre dopo la seconda saranno espressi in megabyte. Per eseguire questa operazione in un blocco di script ForEach-Object, digitare:

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

Sfortunatamente, l'output restituito è costituito da dati cui non è associata nessuna etichetta. Poiché le proprietà WMI di questo tipo sono di sola lettura, non è possibile convertire direttamente il valore di FreeSpace. Se si digita:

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

Verrà visualizzato un messaggio di errore:

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

È possibile riorganizzare i dati utilizzando alcune tecniche avanzate, tuttavia un approccio più semplice consiste nel creare un nuovo oggetto tramite Select-Object.




Argomenti della Guida