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 期望 get
或 list
或 call
等地方
顺便说一句,如果您需要查询字符串,则必须在双引号内使用单引号。与布尔值和整数不同,字符串必须用引号引起来。
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
我在使此 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 期望 get
或 list
或 call
等地方
顺便说一句,如果您需要查询字符串,则必须在双引号内使用单引号。与布尔值和整数不同,字符串必须用引号引起来。
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