Vmware-Esxi

匯聚 buslogic SCSI 硬體和虛擬機作業系統

  • October 21, 2013

我正在嘗試使用 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 的作業系統。我沒有看到我的程式碼在哪裡失敗。

在最後一行之前,您一直走在正確的軌道上,這就是一切都出錯的地方。請記住,$_動態更改值,而$vm保持與第 3 行獲得的值相同。此外,您並沒有真正利用流水線 - 例如 this: 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

引用自:https://serverfault.com/questions/547074