Vmware-Esxi
匯聚 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 的作業系統。我沒有看到我的程式碼在哪裡失敗。
在最後一行之前,您一直走在正確的軌道上,這就是一切都出錯的地方。請記住,
$_
動態更改值,而$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