WMIC和'以及'的问题动词

时间:2015-03-06 22:01:42

标签: batch-file wmic

我在使这个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

我错过了一些简单但我不知道的事情。我一直在"和 - 别名动词无效。"

TIA

马特

3 个答案:

答案 0 :(得分:3)

正如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

还有一些其他问题需要考虑。在wmic循环中调用for时,需要引用等号和逗号以及插入符号。此外,在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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我在工作中遇到了同样的问题。我的尝试是使用VBS并将IpEnabled作为查询的一部分,而DefaultIPGateway是Sub的一部分,部分归功于WMICreator Tool如何格式化示例代码。

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

    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