我使用ipconfig /all
或getmac /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
注意,批处理文件中的每个 都%
必须替换为%%
。
进一步阅读
答案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
获得比 getmac /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
请注意,>> 将向文件添加信息,而 > 将覆盖文件。