はじめに
VBScriptから、WQL (WMI Query Language) を使用した際、結果の並び順をソートしたいので、SQL分に 'oder by' をつけて実行すると、エラーになってしまいます。
なんと、WQLでは'oder by'がサポートされていないんです。
結果を並び替えるこなんて普通にあると思うのですが、すごく使いずらい。
そこで、ADO(ActiveX Data Objects)を使用したソートのサンプルを掲載します。
また、フィルターのサンプルも掲載します。
WQLで'WHERE'条件を指定せず、あとからADOでフィルターすることが出来るので、if文を多用したり、再度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