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