windows - 在 Windows 命令行中获取接口(interface)名称、IP 和 MAC

标签 windows cmd command-line wmic ipconfig

我想获得一台机器上所有接口(interface)、IP 和 MAC 地址的列表。我有很多机器可以从(大约 600 台)获取这些信息,但我不能在这些设备上使用批处理文件。我想发送命令并返回回显输出。

我需要的所有信息都在 ipconfig/all 中,但我不确定如何使用 for 循环解析它。我对那个复杂的循环还是很陌生。本质上,如果可能的话,我需要得到一个单行输出。有什么建议吗?

hostname, interface1 name, IP, Mac, interface2 name, ip mac,...

编辑: 我在 WMIC 输出方面运气不错,但在将其正确显示在文件中时遇到了问题。如果我运行这些。

wmic computersystem get name  
wmic nic where netenabled=true get netconnectionID   
wmic /output:C:\wmictest.csv nicconfig where IPEnabled=True get ipaddress, macaddress /format:csv

我的输出不显示 netconnectionID。输出文件也作为文本前的空行。没什么大不了的,但很奇怪。关于如何将所有信息正确地放入文件的任何建议?这是我的示例输出。

Node,IPAddress,MACAddress  
U8001674-TPL-A,{10.91.35.84;fe80::52b:9817:6bbf:dca4},F0:1F:AF:2A:5E:B5

最佳答案

这是一个 wmic 解决方案,结果是 echo =!HostName!,!NetConID!,!IP_Addrs!,!MAC_Addr!,每个事件适配器一行本地计算机(不能尝试在远程计算机上运行它所必需的改编):

@ECHO OFF >NUL
@SETLOCAL enableextensions enabledelayedexpansion
set "HostName="
wmic computersystem get name ^
  /format:textvaluelist.xsl>"%temp%\cmptr.txt" 2>nul
for /F "tokens=1* delims==" %%G in ('type "%temp%\cmptr.txt"') do (
  if /i "%%G"=="Name" set "HostName=%%~H"
)
set "MAC_Addr="
for /F "tokens=1* delims=:" %%G in ('ipconfig /all^|find /i "Physical Address"') do (
  set "foo="
  for %%I in (%%~H) do if not "%%~I"=="" set "foo=%%~I"
  set "MAC_Addr=!foo:-=:!"
  set "NetConID="
  wmic nic where "NetEnabled='true' and MACAddress='!MAC_Addr!'" ^
    list /format:textvaluelist.xsl>"%temp%\wmcnc.txt" 2>&1
  for /F "tokens=1* delims==" %%I in ('type "%temp%\wmcnc.txt"') do (
    if /i "%%I"=="NetConnectionID" set "NetConID=%%~J"
  )
  set "IP_Addrs="
  wmic nicconfig where "IPEnabled='True' and MACAddress='!MAC_Addr!'" ^
    list /format:textvaluelist.xsl>"%temp%\wmcnccfg.txt" 2>&1
  for /F "tokens=1* delims==" %%I in ('type "%temp%\wmcnccfg.txt"') do (
    if /i "%%I"=="IPAddress" set "IP_Addrs=%%~J"
  )
  if not "!NetConID!,!IP_Addrs!"=="," (
    @echo =!HostName!,!NetConID!,!IP_Addrs!,!MAC_Addr!
  )
)
:endlocal
del "%temp%\cmptr.txt" 2>nul
del "%temp%\wmcnc.txt" 2>nul
del "%temp%\wmcnccfg.txt" 2>nul
@ENDLOCAL
goto :eof

另一种解决方案解析来自 ipconfig/ALL 的半线性输出,并给出最接近先前 wmic 的结果,如下所示:

@ECHO OFF >NUL
@SETLOCAL enableextensions enabledelayedexpansion
  set "HostName="
  set "NetConID="
  set "IP_Addr4="
  set "IP_Addr6="
  set "MAC_Addr="
for /F "tokens=1* delims=:" %%G in ('ipconfig /ALL') do (
  set "foo=%%~G"
  if not "!foo:Host name=!"=="!foo!" (
    for %%I in (%%~H) do if not "%%~I"=="" set "HostName=%%~I"
  )
  if "!foo:adapter=!"=="!foo!" (
    if not "!foo:Physical Address=!"=="!foo!" (
      for %%I in (%%~H) do if not "%%~I"=="" set "MAC_Addr=%%~I"
    )
    if not "!foo:IPv4 Address=!"=="!foo!" (
      for %%I in (%%~H) do if not "%%~I"=="" set "IP_Addr4=%%~I"
      set "IP_Addr4=!IP_Addr4:(preferred)=!"
    )
    if not "!foo:local IPv6 Address=!"=="!foo!" (
      for %%I in (%%~H) do (
        if not "%%~I"=="" (
          for /F "delims=%%" %%p in ("%%~I") Do set "IP_Addr6=%%~p"
          rem set "IP_Addr6=!IP_Addr6:(preferred)=!"
        )
      )
    )
  ) else (
    if not "!IP_Addr6!,!IP_Addr4!"=="," (
      @echo #!HostName!,!NetConID!,{"!IP_Addr4!","!IP_Addr6!"},!MAC_Addr!
    )
    set "MAC_Addr="
    set "IP_Addr4="
    set "IP_Addr6="
    set "NetConID=!foo:*adapter =!"
  )
)
if not "!IP_Addr6!,!IP_Addr4!"=="," (
  @echo =!HostName!,!NetConID!,{"!IP_Addr4!","!IP_Addr6!"},!MAC_Addr!
)

:endlocal
@ENDLOCAL
goto :eof

关于windows - 在 Windows 命令行中获取接口(interface)名称、IP 和 MAC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27160042/

相关文章:

系统配置目录的 Windows 等价物

linux - 如何在 Linux 中打开一个程序的多个实例

git - 如何从命令行在组织下创建 GitHub 存储库?

c# - Foo.cmd 不会输出进程中的行(在网站上)

windows - 通过powershell在windows 10中添加国际英语键盘

windows - 在 SerialCommunication C++ 中使用 Mutex 时出现多线程问题

windows - 如何从命令行检查特定的 Subversion 修订版?

windows - 通过终端关闭 Kafka

windows - 如何将 Haskell 嵌入到批处理文件中(hash-bang runhaskell for Windows)?

windows - BAT 脚本发送命令给它启动的程序