有没有办法在 Windows 中通过命令提示符只获取以太网 MAC 地址?

Sou*_*osh 7 windows command-line ipconfig cmd.exe

我使用ipconfig /allgetmac /v来获取所有 NIC 物理地址。

但问题是,一般一台电脑有不止一个网卡。还有一些虚拟 MAC 地址——比如微软虚拟 Wi-Fi 热点网卡——它只在 wifi 热点打开时显示。

那么,如何通过命令提示符只收集以太网对应的地址呢?

输出:(使用getmac /fo csv /v和wifi热点关闭)

"Connection Name","Network Adapter","Physical Address","Transport Name" "Ethernet","Realtek PCIe FE Family Controller","A0-2B-B8-27-62-12","\Device\Tcpi p_{F1FF9AF6-AD1A-4C5E-8717-C646C9AE466C}" "Wi-Fi","Qualcomm Atheros QCA9565 802.11b/g/n WiFi Adapter","28-E3-47-D2-FB-60", "Media disconnected"

输出:(使用getmac /fo csv /v和wifi热点打开)

"Connection Name","Network Adapter","Physical Address","Transport Name" "Ethernet","Realtek PCIe FE Family Controller","A0-2B-B8-27-62-12","\Device\Tcpi p_{F1FF9AF6-AD1A-4C5E-8717-C646C9AE466C}" "Wi-Fi","Qualcomm Atheros QCA9565 802.11b/g/n WiFi Adapter","28-E3-47-D2-FB-60", "Media disconnected" "Local Area Connection* 7","Microsoft Hosted Network Virtual Adapter","4A-E3-47- D2-FB-60","\Device\Tcpip_{630B2924-03A8-41C1-B1F2-D981A4C263C6}"

我的所有适配器列表:(wmic nic) http://pastebin.com/zyz9LjJe

更新 (可能的解决方案):@DavidPostill 和 @wmz 的回答对我帮助很大。最后我得到了一个解决方案来消除所有具有虚拟 MAC 地址的虚拟适配器。 x2-xx-xx-xx-xx-xx x6-xx-xx-xx-xx-xx xA-xx-xx-xx-xx-xx xE-xx-xx-xx-xx-xx

虚拟 MAC 适配器最常使用具有这些范围的 MAC 地址。 https://serverfault.com/questions/40712/what-range-of-mac-addresses-can-i-safely-use-for-my-virtual-machines

所以,通过getmac命令获取所有MAC地址后,我们可以使用正则表达式过滤掉那些虚拟MAC地址。此外,我们注意到通过“wi-fi”过滤MAC比通过“本地连接”过滤更可靠。因此,我们过滤掉名称中带有“wi-fi”的连接,以获得最终的 LAN/以太网连接。

Dav*_*ill 9

有没有办法通过命令提示符只获取以太网 MAC 地址?

您可以使用一行(但很复杂)的内置命令序列来执行您需要的操作。

从命令行:

for /f "usebackq tokens=3 delims=," %a in (`getmac /fo csv /v ^| find "Local Area Connection"`) do set MAC=%~a
Run Code Online (Sandbox Code Playgroud)

从批处理文件:

for /f "usebackq tokens=3 delims=," %%a in (`getmac /fo csv /v ^| find "Local Area Connection"`) do set MAC=%%~a
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

我们可以用:

getmac /fo csv /v
Run Code Online (Sandbox Code Playgroud)

获取媒体访问控制 (MAC) 地址和与所有本地网卡的每个地址关联的网络协议列表。

使用该/v选项获取详细输出(包括“连接名称”)。稍后需要“连接名称”,以便我们可以识别哪个适配器是Ethernet连接:

"Connection Name","Network Adapter","Physical Address","Transport Name"
"Local Area Connection","Realtek PCIe GBE Family Controller","F0-BF-97-62-95-5D","\Device\Tcpip_{45B9E87F-83FB-4829-A751-6B62656CC1A8}"
"Wireless Network Connection","Atheros AR9285 Wireless Network Adapter","CC-AF-78-B2-4C-09","\Device\Tcpip_{B108BB0B-CCDC-4ACA-9DFE-5A2F17BC138D}"
"Bluetooth Network Connection","Bluetooth Device (Personal Area Network)","CC-AF-78-B2-4C-0A","Media disconnected"
Run Code Online (Sandbox Code Playgroud)

如果我们|将此输出通过管道传输到find我们可以仅提取Ethernet连接的信息(连接名称为“本地连接”):

getmac /fo csv /v ^| find "Local Area Connection"
Run Code Online (Sandbox Code Playgroud)

以 csv(逗号分隔)格式返回“本地连接”信息,如下所示:

"Local Area Connection","Realtek PCIe GBE Family Controller","F0-BF-97-62-95-5D","\Device\Tcpip_{45B9E87F-83FB-4829-A751-6B62656CC1A8}"
Run Code Online (Sandbox Code Playgroud)

第三个(逗号分隔)值是 MAC 地址。

现在我们使用该for命令从上述字符串中提取 MAC 地址。

字符串被传递给for命令(通过使用`(反引号)字符和usebackq

for /f "usebackq tokens=3 delims=," %a in (`string`) do
Run Code Online (Sandbox Code Playgroud)

返回逗号分隔的第三个标记(值)string,如下所示:

"F0-BF-97-62-95-5D"
Run Code Online (Sandbox Code Playgroud)

%~a 用于从字符串中删除引号,留下:

F0-BF-97-62-95-5D
Run Code Online (Sandbox Code Playgroud)

最后变量MAC设置为F0-BF-97-62-95-5D

set MAC=%~a
Run Code Online (Sandbox Code Playgroud)

注意批处理文件中的 each%必须替换为%%.


进一步阅读

  • Windows CMD 命令行的 AZ 索引- Windows cmd 行相关的所有内容的极好参考。
  • find - 在文件中搜索文本字符串并显示找到的所有行。
  • for /f - 针对另一个命令的结果循环命令。
  • getmac - 显示本地或跨网络的每台计算机中所有网卡的媒体访问控制 (MAC) 地址和与每个地址关联的网络协议列表。
  • 参数- 命令行参数(或参数)是传递给批处理脚本的任何值。
  • set - 显示、设置或删除 CMD 环境变量。使用 SET 所做的更改将仅在当前 CMD 会话期间保留。


wmz*_*wmz 5

使用 wmic

(仅限以太网连接接口)

wmic nic where (AdapterTypeId=0 AND netConnectionStatus=2) get MACAddress

有关可用属性的更多信息:https : //msdn.microsoft.com/en-us/library/aa394216%28v=vs.85%29.aspx

编辑:正如大卫所指出的,这也会返回 WiFi 适配器(这可能是也可能不是 OP 想要的)。过滤除 LAN 以外的任何内容的快速而肮脏的方法(基于连接名称):

wmic nic where "NetConnectionId like '%Local Area%' and AdapterTypeId=0 AND netConnectionStatus=2" get MACAddress