web-dev-qa-db-ja.com

BuslogicSCSIハードウェアと仮想マシンオペレーティングシステムの収集

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

このコードを実行してもエラーは発生しませんが、実行するたびにサーバーの名前のみが表示され、OSは取得されません。また、作成しているcsvログのサーバーの名前とは別の列にOSを表示するために何をする必要があるのか​​わかりません。

各仮想マシンのOSバージョンを取得し、それを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ハードウェアを取得し、バスロジックのみを取得するようにハードウェアをフィルタリングしてから、フィルタリングされたVMのみのオペレーティングシステムを取得したいと考えています。コードがどこで失敗するかはわかりませんが。

1
Valrok

あなたはその最後の行までは正しい方向に進んでいましたが、それはすべてがうまくいかないところです。それを念頭に置いて $_は動的に値を変更しますが、$vmは、3行目と同じ値を維持します。また、パイプラインを実際に利用していません。この: Get-VM | Get-ScsiControllerこれと同じことをします:

Get-VM | Foreach-Object {
$vm = $_
Get-ScsiController -VM $vm 
}

レポートを取得するための最良の方法は、すべてのデータを含む配列を作成することだと思いますnfiltered次に、それをcsvにエクスポートし、Excelなどでフィルタリング/グループ化などを行います。これは、「OS名」が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
1
1.618

まず、カットアンドペーストして置き換えるだけで、恐ろしいネストされたループを単純に作成したように見えます。コードフローについて考えてください。なぜ3番目のforeachステートメント?

出力の場合:Powershellの学習を開始する必要があります。つまり、PowerShellの学習方法を学習する必要があります。グーグルとMSサイトは大いに役立つでしょうそうなるでしょう組み込みのヘルプシステム。 (ループの途中で追加を行うのではなく)すべてをこれにパイプします

Export-CSV $log

それを知らなかった場合は、get-help *csv*と入力して見つけることができます。

0
mfinni