2014/05/07

Windows Server 2008上のPowerShellでHyper-Vの仮想マシンの状態一覧を出すコマンド

WMI+VBScript経由で取得するサンプルスクリプトはいくつか見つけたんですが、PowerShell版はうまく動かなかったりするので書き直したものを残しておきます。

VMStateは仮想マシンの状態を文字列に戻すためのハッシュ変数。
Msvm_ComputerSystemが戻すオブジェクトは仮想マシン+ホストマシンの一覧になっていて、EnabledStateが実際のマシン状態を表す整数値(と見せかけて文字列)を返してくる。
※ EnabledStateをそのままVMState変数に突っ込むと"2"みたいな文字列でハッシュを当たりに行くので、[int]$_.EnabledStateでint型に変換してからVMStateに当たりに行くのが書き換えたポイント。

$VMState=@{
  0="Unknown" ;
  2="Running" ;
  3="Stopped" ;
  32768="Paused" ;
  32769="Suspended";
  32270="Starting" ;
  32771="Snapshotting" ;
  32773="Saving" ;
  32774="Stopping" ;
  32776="Pausing" ;
  32777="Resuming"

Get-WmiObject -Namespace "root\virtualization" -ComputerName "." -Class Msvm_ComputerSystem | Format-Table -autosize @{Label="CurrentDate"; expression={Get-Date -Format "G"}}, @{Label="ElementName"; expression={$_.ElementName}}, @{Label ="EnabledState"; expression={$VMState[[int]$_.EnabledState]}}, Caption, Description

PS C:\Windows\system32> $VMState=@{
  0="Unknown" ;
  2="Running" ;
  3="Stopped" ;
  32768="Paused" ;
  32769="Suspended";
  32270="Starting" ;
  32771="Snapshotting" ;
  32773="Saving" ;
  32774="Stopping" ;
  32776="Pausing" ;
  32777="Resuming"


PS C:\Windows\system32> Get-WmiObject -Namespace "root\virtualization" -ComputerName "." -Class Msvm_ComputerSystem | Format-Table -autosize @{Label="CurrentDate"; expression={Get-Date -Format "G"}}, @{Label="ElementName"; expression={$_.ElementName}}, @{Label ="EnabledState"; expression={$VMState[[int]$_.EnabledState]}}, Caption, Description

CurrentDate         ElementName EnabledState Caption                        Description
-----------         ----------- ------------ -------                        -----------
2014/05/07 11:53:11 TESTHV01    Running      ホスト コンピューター システム Microsoft ホスト コンピューター システム
2014/05/07 11:53:11 HOGEHOGE    Stopped      仮想マシン                     Microsoft Virtual Machine
2014/05/07 11:53:11 TESTPC1     Stopped      仮想マシン                     Microsoft Virtual Machine

2014/05/07 11:53:11 TESTPC2     Running      仮想マシン                     Microsoft Virtual Machine


Windows Server 2012 以降であれば、標準搭載のHyper-VコマンドレットでGet-VM一発で終わるんですけどねぇ…。

PS C:\Users\imksoo> Get-VM

Name               State CPUUsage(%) MemoryAssigned(M) Uptime   Status
----               ----- ----------- ----------------- ------   ------
CentOS6.2-minimal  Off   0           0                 00:00:00 正常稼働中
CentOS6.2-minimal2 Off   0           0                 00:00:00 正常稼働中
CentOS6.3          Off   0           0                 00:00:00 正常稼働中
Chef-Server        Off   0           0                 00:00:00 正常稼働中

0 件のコメント:

コメントを投稿