Você estava no caminho certo até a última linha, que é onde tudo dá errado. Lembre-se de que $_
altera dinamicamente o valor, enquanto $vm
mantém o mesmo valor obtido na linha 3. Além disso, você não está realmente aproveitando o pipelining - por exemplo, isto:
Get-VM | Get-ScsiController
faz o mesmo que isto:
Get-VM | Foreach-Object {
$vm = $_
Get-ScsiController -VM $vm
}
Acho que a melhor maneira de você obter seu relatório é construir um array com todos os dados unfiltered , exportá-lo para um csv e fazer sua filtragem / agrupamento / etc no excel como queiras. Isso seria fácil apenas com o exemplo acima, exceto que "Nome do SO" não é uma propriedade do objeto Controlador SCSI, portanto, é necessário fazer um loop e obtê-lo. Mas então o que fazer com o resultado? Não há lugar óbvio para armazená-lo. Eu escolhi para armazená-lo como uma propriedade adicional do objeto Controlador SCSI:
$rows = @()
$log = "C:\Users\me\Documents\Scripts\ScsiLog.csv"
Get-VM | Get-ScsiController | ForEach-Object {
$row = $_
$os = (Get-VMGuest -vm $row.parent).OSFullName
$row | Add-Member -type NoteProperty -Name OS -Value $os
$rows += $row
}
$rows | select Type, Parent, OS | Export-CSV $log