Вы были на правильном пути до той последней строчки, где все идет не так. Имейте в виду, что $ _
динамически изменяет значение, тогда как $ vm
сохраняет то же значение, что и в строке 3. Кроме того, вы не пользуетесь преимуществами конвейерной обработки, например этот:
Get-VM | Get-ScsiController
делает то же самое, что и следующее:
Get-VM | Foreach-Object {
$vm = $_
Get-ScsiController -VM $vm
}
Я думаю, что лучший способ получить отчет - это создать массив со всеми неотфильтрованными данными , а затем экспортировать его в csv и выполните фильтрацию / группировку / и т. д. в Excel или что-то еще. Это было бы просто с помощью приведенного выше примера, за исключением того, что «Имя ОС» не является свойством объекта контроллера SCSI, поэтому вам нужно пройти цикл и получить его. Но что тогда делать с результатом? Нет очевидного места для его хранения. Я решил сохранить его как дополнительное свойство объекта контроллера 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
Во-первых, похоже, что вы наивно создали ужасный вложенный цикл, просто вырезав и вставив и заменив. Подумайте о потоке кода. Зачем нужен третий оператор foreach?
Для вывода: вам действительно нужно начать изучение Powershell, или, скорее, научиться изучать Powershell. Google и сайт MS очень помогут , как и встроенная справочная система. Вставьте все в это (вместо добавления в середине цикла)
Export-CSV $log
Если вы этого не знаете, вы можете набрать get-help * csv *
и найти его.