
Я использую ipconfig /all
или getmac /v
для получения всех физических адресов сетевых карт.
Но проблема в том, что обычно компьютер имеет более одной сетевой карты. Также есть некоторые виртуальные MAC-адреса, например Microsoft Virtual Wi-Fi hotspot NIC, которые отображаются только при включенной точке доступа Wi-Fi.
Итак, как мне получить только адрес, соответствующий Ethernet, через командную строку?
вывод: (используя getmac /fo csv /v
и выключив точку доступа Wi-Fi)
"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
и точку доступа Wi-Fi ВКЛ)
"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/какой-диапазон-mac-адресов-я-могу-безопасно-использовать-для-моих-виртуальных-машин
Итак, получив все MAC-адреса getmac
командой, мы можем отфильтровать эти виртуальные MAC-адреса с помощью регулярного выражения. Более того, мы замечаем, что фильтрация MAC по "wi-fi" более надежна, чем фильтрация по "локальному подключению". Поэтому мы отфильтровываем соединения с "wi-fi" в их именах, чтобы получить окончательное соединение LAN/Ethernet.
решение1
Есть ли способ получить только MAC-адрес Ethernet через командную строку?
Вы можете сделать то, что вам нужно, используя однострочную (но сложную) последовательность встроенных команд.
Из командной строки:
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
Возвращает 3-й токен (значение) из запятой, разделенной string
следующим образом:
"F0-BF-97-62-95-5D"
%~a
используется для удаления кавычек из строки, оставляя:
F0-BF-97-62-95-5D
Наконец, переменная MAC
устанавливается в следующее значение F0-BF-97-62-95-5D
:
set MAC=%~a
Обратите внимание, что в пакетном файле каждый элемент %
необходимо заменить на %%
.
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD- Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- находить- Поиск текстовой строки в файле и отображение всех строк, где она найдена.
- для /ф- Циклическая команда по результатам другой команды.
- getmac- Отображение адреса управления доступом к среде передачи данных (MAC) и списка сетевых протоколов, связанных с каждым адресом для всех сетевых карт на каждом компьютере, как локально, так и в сети.
- параметры- Аргумент командной строки (или параметр) — это любое значение, переданное в пакетный скрипт.
- набор- Отображение, установка или удаление переменных среды CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
решение2
С использованиемwmic
(Только интерфейсы, подключенные к Ethernet)
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 out (на основе имени соединения):
wmic nic where "NetConnectionId like '%Local Area%' and AdapterTypeId=0 AND netConnectionStatus=2" get MACAddress
решение3
В Powershell это можно сделать так (в Windows 8 есть командлет Get-NetAdapter, который отсутствует в Windows 7):
(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-адрес машины и запишет его в файл mac.txt, расположенный на диске D:
Объяснение кода: С помощью ключа /F мы указываем, что передаем в цикл @FOR команду 'getmac /fo table /nh' (указанную '') и присваиваем результат выполнения команды переменной 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
Обратите внимание, что >> добавит информацию в файл, а > перезапишет файл.