![]() |
Определение типа адаптера и MAC-адреса
Есть рабочая конструкция под CMD:
Код:
for /f "tokens=3 skip=1" %%a in ('wmic path Win32_NetworkAdapter where "PNPDeviceID like '%%%%USB%%%%' AND AdapterTypeID='0'" get MacAddress^,AdapterType') do set "MacAddress=%%a" Учитывая, что от WMIC Майкрософт собирается полностью отказываться, мне бы хотелось заранее подстелить соломку и получить аналог этого кода на Powershell. Вот, что лично я насоображал: Код:
$NetAdapter = Get-PnpDevice | where {$_.Class -like "Net" -and $_.InstanceId -like "*USB*"} | select FriendlyName А вот этот код должен отлавливать MAC для выявленного адаптера и убирать разделители в строке: Код:
$MacAddress = Get-WmiObject win32_networkadapterconfiguration | where {$_.descraption -like $NetAdapter} | select macaddress |
Код:
(Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI').macaddress -replace '-' > "$env:TEMP\MacAddress.txt" Насчёт WMIC можно не париться, т. к. в Powershell можно также задействовать старые методы: Код:
gwmi Win32_NetworkAdapter # В Powershell 7 уже не работает |
Цитата:
Если ваш скрипт собирает оба ваши MAC в кучу, то мне ваш вариант не подходит! Да и сразу вывод в файл не вариант. Мне нужно, чтобы сначала все шло в переменную. И лишь из нее в файл. Кстати, если в переменной на момент отправки в нее записи что-то было, а новый командлет отработав не нашел соответствий, он оставит переменную без изменений или обнулит? |
насколько понял
Код:
$pci = Get-CimInstance win32_networkadapter -Property AdapterTypeID, PNPDeviceID, MACAddress | |
Ну, последний взять-то не проблема:
Код:
(Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI|^USB' |sort PnPDeviceID -Descending).macaddress[-1] -replace '-' > "$env:TEMP\MacAddress.txt" Код:
$peremennaya = (Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI|^USB' |sort PnPDeviceID -Descending).macaddress[-1] -replace '-' Цитата:
|
там же ещё USB надо отловить, если PCI не найдётся
|
Sham, конструкция -match 'PCI|USB', наверное , не подходит. Не понятно, который из адаптеров окажется в итоговой переменной, при наличии в системе обоих, USB или PCI. Если есть оба, то в результате должен быть именно PCI.
DJ Mogarych, смысл простой: вы забыли про отработку USB-свистков. Есть компы, где кроме "свистка" ничего нет. В этом случае мне нужен MAC свистка. Но если есть PCI, то "свисток" оставляем за бортом. Поэтому сначала отрабатываем USB с результатом в переменную. Потом PCI с результатом в ту же переменную с замещением результата от USB (если есть). И вот уже после этого отправка итога в файл! |
Поправил выше. Берём все подходящие адаптеры, сортируем в обратном порядке (сначала USB, потом PCI), берём последний. Если он один - то он один и будет. Выкидываем разделители, пишем в файл.
Цитата:
|
DJ Mogarych, как-то криво поправил... На выходе одна цифра - последний символ MAC-адреса.
|
Цитата:
like '%%%%PCI%%%%' вроде бы ищет по всей строке, не заякорено на начало, как '^PCI' |
А, понял, у вас один адаптер. Вот так попробуйте:
Код:
((Get-NetAdapter -Physical |? PnPDeviceID -match '^PCI|^USB' |sort PnPDeviceID -Descending).macaddress |select -Last 1) -replace '-' > "$env:TEMP\MacAddress.txt" |
Sham, прошу прощения, сортировку сразу как-то не заметил. Для меня Powershell вообще незнакомый язык.
Так-то, вроде работает. Нужно только испытать на живой машине, где есть две PCI-карты, не будет ли задвоения. У меня под рукой такого компа нет. DJ Mogarych, это уже универсальный вариант и с одним PCI и с двумя работает? Еще один момент: мне нужно, чтобы перед маком был записан текст. К примеру "MAC: 12345564564". Это возможно реализовать? |
"MAC: " + (выражение перед ">") > файл
|
DJ Mogarych, Sham, благодарю!
Помечаю вопрос как решенный. |
Время: 23:48. |
Время: 23:48.
© OSzone.net 2001-