【问题标题】:VBScript WQL Sort Result Set?VBScript WQL 排序结果集?
【发布时间】:2017-09-12 09:55:00
【问题描述】:

显然 WQL 不包含 ORDER BY 子句。有没有办法根据其中一列对结果集进行排序?例如:

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
sSQL = "Select Time,Source,Event,CategoryNum,Category,TypeNum,Type,User,ComputerName,Insertion1,Insertion2,Data from Win32_NTLogEvent Where Logfile = 'System' and SourceName = 'Service Control Manager'"
Set resultSet = objWMIService.ExecQuery (sSQL)
For Each objEvent In resultSet
    ...
Next

有没有办法按Time 列对resultSet 进行排序?

【问题讨论】:

    标签: sorting vbscript resultset wsh wql


    【解决方案1】:

    WQL 确实没有排序子句,因此无法在查询中直接排序。您可以做的是将返回的数据放在disconnected recordset 中,然后对记录集进行排序:

    Set DataList = CreateObject("ADOR.Recordset")
    DataList.Fields.Append "Time", 7
    DataList.Fields.Append "Source", 200, 255
    DataList.Fields.Append "Event", 3
    ...
    DataList.Open
    
    Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!//./root/cimv2")
    qry = "SELECT Time,Source,Event,CategoryNum,Category,TypeNum,Type,User,ComputerName,Insertion1,Insertion2,Data " & _
          "FROM Win32_NTLogEvent " & _ 
          "WHERE Logfile='System' AND SourceName='Service Control Manager'"
    
    For Each evt In wmi.ExecQuery(qry)
        DataList.AddNew
        DataList("Time")   = evt.Time
        DataList("Source") = evt.Source
        DataList("Event")  = evt.Event
        ...
        DataList.Update
    Next
    
    DataList.Sort = "Time"
    DataList.MoveFirst
    Do Until DataList.EOF
        WScript.Echo DataList.Fields.Item("Time") & vbTab & _
            DataList.Fields.Item("Event")
        DataList.MoveNext
    Loop
    

    根据需要调整字段的data type

    【讨论】:

    • 感谢您的建议。编辑和运行示例时,我立即在第 2 行收到错误:参数类型错误、超出可接受范围或相互冲突。代码:800A0BB9 来源:ADODB.Fields
    • 无法复制。请提供证据。
    • 我将它缩减为这两行并放入 test1.vbs:Set DataList = CreateObject("ADOR.Recordset")<br> DataList.Fields.Append "Time", adDate 然后从命令行运行 test1.vbs。得到我引用的弹出消息。我正在使用 Windows 7 Pro x64。
    • 您是否在我的回答中看到adDate?不?这可能与我一开始没有把它放在那里有关。请将创意推迟到您让代码工作之后。 VBScript 不知道这些常量,所以如果你想使用它们,你必须自己定义它们。否则,您必须使用数值。
    • 谢谢。我认为那些是定义的常量。仅供参考,我在这里找到了它们:docs.microsoft.com/en-us/sql/ado/reference/ado-api/datatypeenum
    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多