有沒有辦法在 Windows 中透過命令提示字元僅取得乙太網路 MAC 位址?

有沒有辦法在 Windows 中透過命令提示字元僅取得乙太網路 MAC 位址?

我使用ipconfig /allorgetmac /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%必須替換為%%.


進一步閱讀

  • 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

編輯:正如大衛指出的,這也會返回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

請注意,>> 將向文件添加信息,而 > 將覆蓋文件。

相關內容