Сборка оборудования 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, а затем хочу получить операционную систему только с отфильтрованными виртуальными машинами. Я не вижу, где мой код не работает, хотя.
2 ответа
Вы были на правильном пути до той последней строки, где все идет не так. Имейте в виду, что $_
динамически меняет значение, тогда как $vm
сохраняет то же значение, что и в строке 3. Кроме того, вы не пользуетесь конвейерной обработкой, например:Get-VM | Get-ScsiController
делает то же самое, что и это:
Get-VM | Foreach-Object {
$vm = $_
Get-ScsiController -VM $vm
}
Я думаю, что лучший способ получить отчет - это создать массив со всеми нефильтрованными данными, а затем экспортировать его в CSV-файл и выполнить фильтрацию / группировку / и т. Д. В Excel или где-либо еще. Это было бы легко с только что приведенным выше примером, за исключением того, что "Имя ОС" не является свойством объекта контроллера SCSI, поэтому вам нужно пройтись по нему и получить его. Но что тогда делать с результатом? Там нет очевидного места для его хранения. Я решил сохранить его как дополнительное свойство объекта SCSI Controller:
$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*
и найди это.