MR2オーナー吉田貴幸のブログ

MR2(SW20)オーナー吉田貴幸のブログ。仕事はITインフラエンジニア。愛車の記事とIT関連の情報を発信しています

【Windows】[VBScript] WQL (WMI Query Language) は ODRY BY が使えない。ADOを使って解決しましょう。

 

はじめに

VBScriptから、WQL (WMI Query Language) を使用した際、結果の並び順をソートしたいので、SQL分に 'oder by' をつけて実行すると、エラーになってしまいます。
なんと、WQLでは'oder by'がサポートされていないんです。
結果を並び替えるこなんて普通にあると思うのですが、すごく使いずらい。

そこで、ADO(ActiveX Data Objects)を使用したソートのサンプルを掲載します。

また、フィルターのサンプルも掲載します。
WQLで'WHERE'条件を指定せず、あとからADOでフィルターすることが出来るので、if文を多用したり、再度WQLを実行せず条件抽出が可能です。

  • WQLで使用できるキーワードはこちら

docs.microsoft.com

 

ADOを使用して、WQLの結果をソートする

拡張子に「.vbs」つけて下記のコードを保存してください。
使い方は、ソースにコメントを記載しているので、そちらを参照してください。

'//変数宣言
Option Explicit

Dim oClassSet
Dim oClass
Dim oLocator
Dim oService
Dim sMesStr
Dim oDataset

'////////////////////////////////////////////////////////////////////////////
'//WQLサンプルコード
'//こちらのサイトを使用させていただきました → http://www.wmifun.net/sample/win32_useraccount.html

'ローカルコンピュータに接続する。
Set oLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocator.ConnectServer
'クエリー条件を WQL にて指定する。
Set oClassSet = oService.ExecQuery("Select * From Win32_UserAccount")

'////////////////////////////////////////////////////////////////////////////
'//ここからがADOを使用したソートのサンプルです
'//ADOのプロパティ '//https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/ado-properties?view=sql-server-2017 '//DataTypeEnum '//https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/datatypeenum?view=sql-server-2017 '//ADO定数 const adVarChar = 200
'//結果を保存するためのテーブルに、項目名、データ型を設定します '//項目名は英字のみです Set oDataset = CreateObject("ADOR.Recordset") oDataset.Fields.Append "Name",adVarChar,255 oDataset.Fields.Append "SID",adVarChar,255 oDataset.Open '//テーブルにWQL結果データをテーブルに格納 For Each oClass In oClassSet oDataset.AddNew oDataset("Name") = oClass.Name oDataset("SID") = oClass.SID oDataset.Update Next '//データの並び替え '//Sort プロパティ (ADO) '//https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/sort-property-ado '//項目名 ASC | DESC '//SIDを降順で並び替える場合
oDataset.Sort = "SID DESC" '//データの抽出のサンプルです。これはソートとは関係ないので省略可です。 '//Filter プロパティ (ADO) '//https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/filter-property-ado '//フィルターを解除するにはクリアする '//oDataset.Filter = ""
'//名前をワイルドカードでフィルターする場合
oDataset.Filter = "Name like 'a%'" '//結果出力
'//並び替えは終わっているので最初からレコードを取得すればOKです。
oDataset.MoveFirst Do Until oDataset.EOF WScript.Echo oDataset.Fields.Item("Name") & vbTab & _ oDataset.Fields.Item("SID") oDataset.MoveNext Loop oDataset.close '///////////////////////////////////////////////////////////////////////////// '使用した各種オブジェクトを後片付けする。 Set oClassSet = Nothing Set oClass = Nothing Set oService = Nothing Set oLocator = Nothing Set oDataset = Nothing

 

参考記事

サンプルコードの一部は、こちらのサイトから引用させていただきました。

www.wmifun.net