Я пытаюсь использовать 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*
и найди это.