WMIC 和 'and' 动词问题

Issue with WMIC and 'and' verb

我在使此 WMIC 查询正常工作时遇到了一些问题。

@echo off
setlocal

Call :wmic nicconfig where IPEnabled=TRUE and DefaultIPgateway is not null get ipaddress,macaddress,defaultipgateway /format:list
exit /b

:wmic
for /f "delims=" %%A in ('"wmic %*"') do for /f "delims=" %%B in ("%%A") do echo %%B
exit /b

我遗漏了一些简单的东西,但我不知道是什么。我不断收到 "and - Invalid alias verb."

TIA

马特

WQL 不支持查询数组数据类型(参见 https://msdn.microsoft.com/en-us/library/aa392902.aspx)。这在 shell 脚本(批处理)中完成起来会很烦人,但在 PowerShell 中非常简单:

get-wmiobject Win32_NetworkAdapterConfiguration -filter "IPEnabled=TRUE" |
  where-object { $_.DefaultIPGateway }

正如 Bill_Stewart 指出的那样,DefaultIPGateway 列包含数组数据类型,无法使用 WQL 查询。不过,这并不意味着 wmic 无法处理复合 where 子句。您只需将 where 的参数括在引号内即可。

wmic nicconfig where "IPEnabled=TRUE and IPConnectionMetric>0" get ipaddress,macaddress,defaultipgateway /format:list

看到了吗?整个 IPEnabled=TRUE and IPConnectionMetric>0 就是一个论点。您收到错误是因为 AND 发生在 wmic 期望 getlistcall 等地方

顺便说一句,如果您需要查询字符串,则必须在双引号内使用单引号。与布尔值和整数不同,字符串必须用引号引起来。

wmic nicconfig where "Description LIKE '%%NVIDIA%%'" list /format:list

还有几个其他问题需要考虑。当在 for 循环中调用 wmic 时,等号和逗号需要被引用或脱字符转义。此外,在 for /f 循环中,您不需要在整个命令周围同时使用单引号和双引号。按如下方式更改您的脚本,它应该可以工作:

@echo off
setlocal

call :wmic nicconfig where "IPEnabled=TRUE and IPConnectionMetric>0" get ipaddress^^,macaddress^^,defaultipgateway /format:list
exit /b

:wmic
for /f "delims=" %%A in ('wmic %*') do for /f "delims=" %%B in ("%%A") do echo %%B
exit /b

我 运行 在工作中遇到了同样的问题。我的尝试是使用 VBS 并使 IpEnabled 成为查询的一部分,并使 DefaultIPGateway 成为 Sub 的一部分,这在一定程度上要归功于 WMICreator 工具如何格式化示例代码。

这应该只在两者都适用时写出有效值:

    strComputer = "." 
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True",,48) 

For Each objItem in colItems 
DoWork
next

Sub DoWork()
    If isNull(objItem.DefaultIPGateway) Then
exit sub
    Else
        Wscript.Echo "DefaultIPGateway: " & Join(objItem.DefaultIPGateway, ",")
    End If
    Wscript.Echo "DHCPServer: " & objItem.DHCPServer
    Wscript.Echo "DNSDomain: " & objItem.DNSDomain
    Wscript.Echo "DNSHostName: " & objItem.DNSHostName
    If isNull(objItem.IPAddress) Then
        Wscript.Echo "IPAddress: "
    Else
        Wscript.Echo "IPAddress: " & Join(objItem.IPAddress, ",")
    End If
    Wscript.Echo "IPConnectionMetric: " & objItem.IPConnectionMetric
    Wscript.Echo "IPEnabled: " & objItem.IPEnabled
    If isNull(objItem.IPSubnet) Then
        Wscript.Echo "IPSubnet: "
    Else
        Wscript.Echo "IPSubnet: " & Join(objItem.IPSubnet, ",")
    End If
end Sub