Reunindo o hardware SCSI buslogic e o sistema operacional da máquina virtual

1

Estou tentando usar o Powershell para obter hardware SCSI de vários servidores virtuais e obter o sistema operacional de cada servidor específico. Eu consegui obter o hardware SCSI específico que eu quero encontrar com o meu código, no entanto eu sou incapaz de descobrir como obter corretamente o sistema operacional de cada um dos servidores. Além disso, estou tentando enviar todos os dados que encontro em um arquivo de log csv, mas não tenho certeza de como você pode fazer com que um script powershell crie várias colunas.

Aqui está o meu código (quase funciona, mas algo está errado):

$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
            }
    }

Eu não recebo nenhum erro quando executo este código, no entanto, sempre que o executo, só recebo o nome dos servidores e não o sistema operacional. Também não tenho certeza do que preciso fazer para que o sistema operacional apareça em uma coluna diferente do nome do servidor no log csv que estou criando.

O que eu preciso alterar no meu código para obter a versão do SO de cada máquina virtual e enviá-la em uma coluna diferente no meu arquivo de log csv?

EDIT: Aqui está uma visão mais aprofundada das coisas que eu tentei que falharam:

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
#
#
#       }
#   }

Não sei por que get-VmGuest falha. Estou recebendo o hardware scsi, filtrando o hardware para obter apenas buslogic e, em seguida, querendo obter o sistema operacional de apenas as VMs filtradas. Eu não vejo onde meu código falha embora.

    
por Valrok 18.10.2013 / 20:10

2 respostas

1

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
    
por 18.10.2013 / 22:04
0

Primeiro, parece que você fez ingenuamente um loop anormal horrível apenas cortando e colando e substituindo. Pense no fluxo do código. Por que a terceira declaração foreach?

Para a saída: Você realmente precisa começar a aprender o Powershell, ou melhor, aprender a aprender sobre o PowerShell. O Google e o site MS ajudarão muito, como será o sistema de ajuda integrado. Canalize tudo para isso (ao invés de fazer um acréscimo no meio do seu loop)

Export-CSV $log

Se você não sabia disso, poderia digitar get-help *csv* e encontrá-lo.

    
por 18.10.2013 / 21:10