【问题标题】:VBScript to check driver status with WQL queryVBScript 使用 WQL 查询检查驱动程序状态
【发布时间】:2014-09-17 17:56:26
【问题描述】:

我正在尝试编写一个脚本来检查设备当前是否处于错误级别(在设备管理器中有一个黄色按钮)。我试图自动化的最终任务是安装驱动程序,检查它是否安装正确,卸载,然后再次检查以验证它是否已卸载。我已经弄清楚了大部分,但我在 WQL 查询方面遇到了问题。我可以查询是否有任何驱动程序的错误级别不是 0,并且我可以查询是否有任何驱动程序具有特定的设备 ID,但是当我尝试同时执行这两种操作时,它会失败并显示“drivertest.vbs(4,1) Microsoft VBSCript 运行时错误: type mismatch: '[string: "Select * from Win32_"]' 这是我的代码:

strComputer = "."
Set objWMIService = GetObject(_
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
    ("Select * from Win32_PnPEntity " _
        & "WHERE ConfigManagerErrorCode <> 0" AND "WHERE objItem.DeviceID = 'acpi\int33d6'")
For Each objItem in colItems
    Wscript.Echo "Class GUID: " & objItem.ClassGuid
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "Manufacturer: " & objItem.Manufacturer
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID
    Wscript.Echo "Service: " & objItem.Service
Next

【问题讨论】:

  • 为什么你的AND 在引号之外?试试"Select * from Win32_PnPEntity WHERE ConfigManagerErrorCode &lt;&gt; 0 AND objItem.DeviceID = 'acpi\int33d6'"
  • 如果我像你建议的那样用引号括起整个内容,如果我将其更改为"Select * from Win32_PnPEntity" _ "WHERE ConfigManagerErrorCode &lt;&gt; 0 AND objItem.DeviceID = 'acpi\int33d6'"我会得到一个“未终止的字符串常量”@我得到“drivertest.vbs(7,1) (null) : 0x80041017 根据我发现的错误列表是一个语法错误。原始代码在引号中包含“select *...”和在引号中的“WHERE...”,而不是一起在引号中(如果你跟着我..)你可能会说,编程不是我的强项......
  • 按照我在第一条评论中展示的方式进行操作,但将所有内容放在一行中。将字符串拆分为多行只会让事情暂时变得更加混乱。
  • 相同的错误,除了它更改为 (5,1),我猜这是指第 5 行第 1 列,这是 For Each objItem in collItems 行的开头,但至少我摆脱了“未终止的字符串常量”错误。

标签: sql batch-file vbscript cmd wql


【解决方案1】:

试试这个。我认为你的问题是反斜杠。那些必须在 WQL 中转义。注意acpi\\int33d6 中的双反斜杠。

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_PnPEntity WHERE ConfigManagerErrorCode<>0 AND DeviceID='acpi\\int33d6'")

For Each objItem In colItems
    Wscript.Echo "Class GUID: " & objItem.ClassGuid
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "Manufacturer: " & objItem.Manufacturer
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID
    Wscript.Echo "Service: " & objItem.Service
Next

【讨论】:

  • 仍然是同样的问题 :-( 谷歌对错误代码也没有帮助,只是它是一个语法错误。我对那行做什么似乎都没有关系,我仍然得到错误,但它指向For Each 行,让我相信要么它没有像这样接收查询的结尾,要么我的代码中某处有一个不可见的字符让解释器感到困惑。
  • 你复制粘贴上面的代码了吗?我必须进行其他一些更改(您的 WQL 中有 objItem.DeviceID,这是不对的)。但是这段代码对我来说很好。
【解决方案2】:

我明白了!非常感谢@Bond 的帮助!!!这是一个太多 WHERE 语句的组合,我应该使用 LIKE 而不是 =

strComputer = "."
Set objWMIService = GetObject(_
    "winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery ("Select * from Win32_PnPEntity WHERE DeviceID LIKE   '%int33d6%' AND ConfigManagerErrorCode <> 0")

For Each objItem in colItems
    Wscript.Echo "Class GUID: " & objItem.ClassGuid
    Wscript.Echo "Description: " & objItem.Description
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "Manufacturer: " & objItem.Manufacturer
    Wscript.Echo "Name: " & objItem.Name
    Wscript.Echo "PNP Device ID: " & objItem.PNPDeviceID
    Wscript.Echo "Service: " & objItem.Service
Next

现在像冠军一样工作:-)

【讨论】:

    猜你喜欢
    • 2019-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2020-12-07
    • 1970-01-01
    • 2012-03-04
    • 2012-01-06
    • 2020-04-12
    相关资源
    最近更新 更多