Назад | Перейти на главную страницу

Сбор оборудования buslogic SCSI и операционной системы виртуальной машины

Я пытаюсь использовать Powershell, чтобы получить оборудование SCSI с нескольких виртуальных серверов и получить операционную систему каждого конкретного сервера. Мне удалось получить конкретное оборудование SCSI, которое я хочу найти с помощью своего кода, однако я не могу понять, как правильно получить операционную систему каждого из серверов. Кроме того, я пытаюсь отправить все данные, которые я нахожу, в файл журнала csv, однако я не уверен, как вы можете заставить сценарий PowerShell создавать несколько столбцов.

Вот мой код (почти работает, но что-то не так):

$log = "C:\Users\me\Documents\Scripts\ScsiLog.csv"
Get-VM | Foreach-Object {
    $vm = $_
        Get-ScsiController -VM $vm | Where-Object { $_.Type -eq "VirtualBusLogic" } | Foreach-Object {
            get-VMGuest -VM $vm } | Foreach-Object{
        Write-output $vm.Guest.VmName  >> $log
            }
    }

Я не получаю никаких ошибок при запуске этого кода, однако всякий раз, когда я запускаю его, я получаю только имена серверов, а не ОС. Также я не уверен, что мне нужно сделать, чтобы ОС отображалась в столбце, отличном от имени сервера в журнале csv, который я создаю.

Что мне нужно изменить в моем коде, чтобы получить версию ОС каждой виртуальной машины и вывести ее в другой столбец в моем файле журнала csv?

РЕДАКТИРОВАТЬ: вот более подробный взгляд на вещи, которые я пробовал, но все они потерпели неудачу:

Get-VM | Foreach-Object {
    $vm = $_    
    $svm = Get-ScsiController -VM $vm | Where-Object { $_.Type -eq "VirtualBusLogic" } 
    Foreach-Object {get-VMGuest -VM $svm } | Foreach-Object{Write-output $svm >> $log}
    }

#Get-VM | Foreach-Object {
#   $vm = $_
#       Get-ScsiController -VM $vm | Where-Object { $_.Type -eq "VirtualBusLogic"} #| write-host $vm
#       | Foreach-Object {
#       
#       #get-VMGuest -VM $_ |
#       #write-host $vm
#           #get-VMGuest -VM $vm } | Foreach-Object{
#       #write-output $vm.VmName >> $log
#       #write-output $vm.guest.VmName, get-VmGuest -VM $vm >> $log NO GOOD
#
#       Write-host $vm.Guest.VmName #+ get-vmGuest -vm $VM >> $log
#
#
#       }
#   }

Я не уверен, почему get-VmGuest терпит неудачу. Я получаю оборудование scsi, фильтрую оборудование, чтобы получить только buslogic, а затем хочу получить операционную систему только отфильтрованных виртуальных машин. Однако я не вижу, где мой код дает сбой.

Вы были на правильном пути до последней строчки, где все пошло не так. Имейте в виду, что $_ динамически меняет значение, тогда как $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* и найди это.