WIN1@Codename

Codename

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Hyper-V をプログラムでどうにかしてみる その5 (いろいろな書き方)

すでにお気づきの方もいるかと思いますが、WMIにより制御構文ではコードを簡略化して書くことができます。

例えば、仮想マシンの起動では

Dim objObjectQuery As New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")
Dim objManagementObjectSearcher As New ManagementObjectSearcher(objManagementScope, objObjectQuery)
Dim objManagementObjectCollection As ManagementObjectCollection = objManagementObjectSearcher.Get
For Each objManagementObject As ManagementObject In objManagementObjectCollection
    Dim objParams As ManagementBaseObject = objManagementObject.GetMethodParameters("RequestStateChange")
    objParams("RequestedState") = 2
    Dim objManagementBaseObject As ManagementBaseObject = objManagementObject.InvokeMethod("RequestStateChange", objParams, Nothing)
    Console.WriteLine(objManagementBaseObject("ReturnValue"))
Next

 

この部分を

For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
    Dim objParams As ManagementBaseObject = objManagementObject.GetMethodParameters("RequestStateChange")
    objParams("RequestedState") = 2
    Dim objManagementBaseObject As ManagementBaseObject = objManagementObject.InvokeMethod("RequestStateChange", objParams, Nothing)
    Console.WriteLine(objManagementBaseObject("ReturnValue"))
Next

 

このように簡略化して書くことができます。
さらにFor Each ~ Next を使用せずコレクションをずばり指定してこのように書くことも

 

Dim objIEnumerator As IEnumerator = New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get.GetEnumerator
objIEnumerator.MoveNext() '最初のコレクションに移動
Dim objCurrentEnumerator As ManagementObject = objIEnumerator.Current
Dim objParams As ManagementBaseObject = objCurrentEnumerator.GetMethodParameters("RequestStateChange")
objParams("RequestedState") = 2
Dim objManagementBaseObject As ManagementBaseObject = objCurrentEnumerator.InvokeMethod("RequestStateChange", objParams, Nothing)
Console.WriteLine(objManagementBaseObject("ReturnValue"))

 

と、このように同じ結果でも様々なアプローチの仕方がありますので、場合により使い分けるのもよいですね。


コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://codename2010.blog11.fc2.com/tb.php/45-aada370c
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。