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

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

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

但问题是,一般一台电脑都有不止一块网卡,而且有些虚拟MAC地址——比如微软虚拟WiFi热点网卡——只有打开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/以太网连接。

答案1

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

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

从命令行:

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

从批处理文件:

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

它是如何工作的?

我们可以用:

getmac /fo csv /v

获取所有本地网卡的媒体访问控制 (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"

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

getmac /fo csv /v ^| find "Local Area Connection"

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

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

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

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

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

for /f "usebackq tokens=3 delims=," %a in (`string`) do

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

"F0-BF-97-62-95-5D"

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

F0-BF-97-62-95-5D

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

set MAC=%~a

注意,批处理文件中的每个 都%必须替换为%%


进一步阅读

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

答案2

使用wmic

(仅限以太网连接接口)

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

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

编辑:正如 David 所说,这也会返回 WiFi 适配器(这可能是也可能不是 OP 想要的)。快速而粗略的方法来过滤除 LAN 之外的任何内容(基于连接名称):

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

答案3

在 Powershell 中,你可以这样做(Windows 8 具有 Windows 7 不附带的 Get-NetAdapter Cmdlet):

(get-wmiobject win32_networkadapter -Filter "AdapterType LIKE 'Ethernet 802.3'") | select -expand macaddress
11:22:33:45:04:1E

答案4

我似乎找到了一个更简单的解决方案来将 mac 地址写入文件中

@FOR /F %%i IN ('getmac /fo table /nh') DO ECHO %%i >> D:\mac.txt

将获取机器 mac 地址并将其写入位于磁盘 D 的 mac.txt 文件:

代码解释:使用 /F 键,我们指定将命令“getmac /fo table /nh”(由 '' 指定)传递给循环 @FOR,并将命令执行的结果分配给变量 i。然后我们使用 ECHO 将变量 i 的值写入文件。我使用了

getmac /fo table /nh

获得比 g​​etmac /fo csv 更简单的输出 这是 getmac /fo table /nh 的输出

00-03-7F-50-5C-0D   \Device\Tcpip_{AD7B1C5C-5027-46A3-B693-95D01D7A0C6C}

因此,我们只需要将此字符串传递给 @FOR 循环,默认情况下,在这种情况下,它将在第一个空格之前读取文件(无需定义特殊键)并将读取的值分配给变量 i。然后我们使用 ECHO 命令将其值写入文件

 DO ECHO %%i >> D:\mac.txt

请注意,>> 将向文件添加信息,而 > 将覆盖文件。

相关内容