
我使用ipconfig /all
orgetmac /v
來取得所有網路卡物理位址。
但問題是,一般一台電腦都有多個網路卡。還有一些虛擬 MAC 位址(例如 Microsoft 虛擬 Wi-Fi 熱點 NIC),僅在 Wi-Fi 熱點開啟時顯示。
那麼,如何透過命令提示字元只收集乙太網路對應的位址呢?
輸出:(使用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
請注意,批次檔中的 every%
必須替換為%%
.
進一步閱讀
答案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
編輯:正如大衛指出的,這也會返回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
請注意,>> 將向文件添加信息,而 > 將覆蓋文件。