Команда для поиска сетевого интерфейса для IP
С ipconfig
Я могу показать список сетевых адаптеров и их настройки, например, IP-адрес.
Я ищу обратную команду, которая отображает имя сетевого адаптера для данного IP-адреса.
Я попытался отфильтровать вывод ipconfig
с такой командой ipconfig | find "192.168.2.4"
но тогда имя адаптера пропало.
Мой вывод ipconfig
есть (хитрая часть кажется, что у меня есть несколько адресов на одном адаптере здесь):
Windows IP Configuration
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::xxxx:xxxx:xxxx:xxxx%11
IPv4 Address. . . . . . . . . . . : 192.168.2.4
Subnet Mask . . . . . . . . . . . : 255.255.255.0
IPv4 Address. . . . . . . . . . . : 192.168.178.20
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.178.1
192.168.2.1
Ethernet adapter VMware Network Adapter VMnet1:
...
7 ответов
Как отобразить имя сетевого адаптера для данного IP-адреса?
Это решение не требует каких-либо внешних команд (pcre2grep
, sed
, так далее).
Используйте следующий пакетный файл (getname.cmd):
@echo off
setlocal
setlocal enabledelayedexpansion
set "_adapter="
set "_ip="
for /f "tokens=1* delims=:" %%g in ('ipconfig /all') do (
set "_tmp=%%~g"
if "!_tmp:adapter=!"=="!_tmp!" (
if not "!_tmp:IPv4 Address=!"=="!_tmp!" (
for %%i in (%%~h) do (
if not "%%~i"=="" set "_ip=%%~i"
)
set "_ip=!_ip:(Preferred)=!"
if "!_ip!"=="%1" (
@echo !_adapter!
)
)
) else (
set "_ip="
set "_adapter=!_tmp:*adapter =!"
)
)
endlocal
Использование:
getname ipaddress
Пример:
F:\test>getname 192.168.42.78
Local Area Connection 2
F:\test>
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- for / f - Циклическая команда против результатов другой команды.
- ipconfig - настройка IP (настройка интернет-протокола)
Вы можете использовать этот PS один вкладыш:
$addr='192.168.2.4'; get-wmiobject Win32_NetworkAdapterConfiguration |? {$_.ipaddress -contains $addr} |select Description |% {$_.Description}
Чтобы использовать его прямо из командной строки:
powershell "$addr='192.168.2.4'; get-wmiobject Win32_NetworkAdapterConfiguration |? {$_.ipaddress -contains $addr} |select Description |% {$_.Description}"
или если вы хотите использовать его повторно, поместите его в скрипт и сделайте адрес параметром
Изменить: чтобы получить имя, как показано в Win / Ipconfig:
$addr='192.168.2.4';
$netconf = get-wmiobject Win32_NetworkAdapterConfiguration |? {$_.ipaddress -contains $addr};
$netconf |% {$_.GetRelated("win32_NetworkAdapter")} | select NetConnectionID |%{$_.NetConnectionID}
(присваивание промежуточным переменным только для того, чтобы сделать его немного более читабельным)
Я ищу обратную команду, которая отображает имя сетевого адаптера для данного IP-адреса.
Исходя из всего, что я пробовал, это должно работать, кажется, вы говорите, что вам нужно получить эту информацию ТОЛЬКО с IP-адреса, который вы уже указали в своем примере.
ИНТЕРАКТИВНАЯ ПОДСКАЗКА ДЛЯ IP-АДРЕСА, ЧТОБЫ ПОЛУЧИТЬ ИМЯ СОЕДИНЕНИЯ СЕТИ
(Использование WMIC
и некоторые партии FOR
петля token
а также delim
парсинг для получения имени сетевого подключения для указанного IP-адреса.)
(Значение результата будет отображаться в командном окне и окне сообщения. Это все пакетный сценарий, но динамически создает некоторые функции сценария VBS, чтобы упростить процесс для всех, кто в этом нуждается.)
@ECHO ON
:SetTempFiles
SET tmpIPaddr=%tmp%\~tmpipaddress.vbs
SET tmpNetConName1=%tmp%\~tmpNetConName1.txt
SET tmpNetConName2=%tmp%\~tmpNetConName2.txt
SET tmpBatFile=%tmp%\~tmpBatch.cmd
SET tmpVBNetCon=%tmp%\~tmpVBNetCon.vbs
IF EXIST "%tmpIPaddr%" DEL /F /Q "%tmpIPaddr%"
IF EXIST "%tmpNetConName1%" DEL /Q /F "%tmpNetConName1%"
IF EXIST "%tmpNetConName2%" DEL /Q /F "%tmpNetConName2%"
IF EXIST "%tmpBatFile%" DEL /Q /F "%tmpBatFile%"
IF EXIST "%tmpVBNetCon%" DEL /Q /F "%tmpVBNetCon%"
:InputBox
SET msgboxTitle=IP ADDRESS
SET msgboxLine1=Enter the IP address to get its Windows connection name
>"%tmpIPaddr%" ECHO wsh.echo inputbox("%msgboxLine1%","%msgboxTitle%")
FOR /F "tokens=*" %%N IN ('cscript //nologo "%tmpIPaddr%"') DO CALL :setvariables %%N
GOTO EOF
:setvariables
SET IPAddress=%~1
FOR /F "USEBACKQ TOKENS=3 DELIMS=," %%A IN (`"WMIC NICCONFIG GET IPADDRESS,MACADDRESS /FORMAT:CSV | FIND /I "%IPAddress%""`) DO (SET MACAddress=%%~A)
FOR /F "USEBACKQ TOKENS=3 DELIMS=," %%B IN (`"WMIC NIC GET MACADDRESS,NETCONNECTIONID /FORMAT:CSV | FIND /I "%MACAddress%""`) DO ECHO(%%~B>>"%tmpNetConName1%"
::: Parse Empty Lines
FINDSTR "." "%tmpNetConName1%">"%tmpNetConName2%"
::: Build Dynamic Batch with ECHO'd Network Connection Value
FOR /F "tokens=*" %%C IN (%tmpNetConName2%) DO ECHO ECHO %%~C>>"%tmpBatFile%"
IF NOT EXIST "%tmpBatFile%" GOTO :NullExit
START "" "%tmpBatFile%"
::: Build Dynamic VBS with Message Box Network Connection Value
FOR /F "tokens=*" %%C IN (%tmpNetConName2%) DO (SET vbNetconName=%%~C)
ECHO msgbox "%vbNetconName%",0,"%vbNetconName%">"%tmpVBNetCon%"
START /B "" "%tmpVBNetCon%"
EXIT /B
:NullExit
ECHO msgbox "Cannot find MAC Address, check to confirm IP Address was correct.",0,"Invalid IP">"%tmpVBNetCon%"
START /B "" "%tmpVBNetCon%"
EXIT /B
ВСЕ ОДИН ЛАЙНЕРЫ
РОДНЫЕ ОКНА ТОЛЬКО С NETSH ВСЕМИ ИНТЕРФЕЙСАМИ (ВСЕ АДРЕСА IPv4)
NETSH INT IP SHOW CONFIG | FINDSTR /R "Configuration for interface.* Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
РОДНЫЕ ОКНА ТОЛЬКО С IPCONFIG ВСЕМИ ИНТЕРФЕЙСАМИ (ВСЕ АДРЕСА IPv4)
IPCONFIG | FINDSTR /R "Ethernet* Address.*[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"
ИСПОЛЬЗОВАНИЕ PCRE2GREP (для @SalvoF)
УДЕЛЬНЫЙ IP-АДРЕС УКАЗАН
netsh interface ipv4 show address | pcre2grep -B2 "192\.168\.2\.4" | FIND /V "DHCP"
НАЙТИ ВСЕ IP-АДРЕСА
netsh interface ip show config | pcre2grep -B2 ^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$ | FIND /V "DHCP" | FIND /V "Gate" | FIND /V "Metric" | FIND /V "Subnet"
НАЙТИ ВСЕ IP-АДРЕСА (очищенное регулярное выражение (для @SalvoF))
netsh interface ip show config | pcre2grep "^[A-Z]|IP.*([0-9]{1,3}(\.|)){4}"
Обратите внимание, что pcre2grep
Я пытался это за @SalvoF [+1]
как он предложил, но используя.... FIND /V
удалить строку выше, содержащую DHCP
кажется, получить желаемый результат, как вы описали. я использовал NETSH
скорее, чем IPCONFIG
также.
Просто для справки, вот еще одно пакетное решение, оно использует замедленное расширение %ERRORLEVEL%
системная переменная:
@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%L in ('ipconfig') do (
echo %%L | findstr /r "^[A-Z]" 1>NUL
if !errorlevel! == 0 set "_int=%%L"
echo %%L | findstr /c:%1 1>NUL
if !errorlevel! == 0 (
set "_int=!_int::=!"
echo !_int:* adapter =!
goto:eof
)
)
Это может быть вызвано следующим образом: find_int.cmd 192.168.1.100
Чтобы быть более точным, следуя примеру OP, я бы использовал sed
, который можно найти под \usr\local\wbin
папка с этим zip-файлом (проект UnxUtils).
ipconfig | sed -rn "/^[A-Z]/h;/192.168.2.4/{g;s/.* adapter (.*):/\1/p;}"
-n
подавляет несовпадающие строки; первый шаблон находит любую строку, начинающуюся с заглавной буквы, затем h
убирает это на удерживающее пространство; второе совпадение находится на требуемом IP-номере: в этот момент вызывается имя интерфейса, содержащее строку (g
) лишний лишний начальный текст (s
) и распечатаны (p
).
Спасибо за усилия всем. Кажется, есть несколько препятствий:
- количество IP-адресов, назначенных адаптеру
- язык ОС
Все -Bx
и кажется, что Regex легко ломается, поэтому я нашел что-то, что мог бы реализовать сам, и предложил следующую программу на C#, которая принимает IP-адрес в качестве параметра (IP2Adapter <IP>
):
using System;
using System.Net.NetworkInformation;
using System.Net.Sockets;
namespace IP2Adapter
{
class Program
{
static void Main(string[] args)
{
var adapters = NetworkInterface.GetAllNetworkInterfaces();
foreach (var adapter in adapters)
{
var ipProps = adapter.GetIPProperties();
foreach (var ip in ipProps.UnicastAddresses)
{
if ((adapter.OperationalStatus == OperationalStatus.Up)
&& (ip.Address.AddressFamily == AddressFamily.InterNetwork))
{
if (ip.Address.ToString() == args[0])
Console.Out.WriteLine(adapter.Name);
}
}
}
}
}
}
В Windows 10 Powershell этого можно достичь с помощью следующего:
Get-NetIPAddress -IPAddress '192.168.2.4' | %{$_.InterfaceAlias};
Это даст такой результат, как Wi-Fi
,
Где можно заменить InterfaceAlias
для любого другого свойства объекта.
Чтобы получить все свойства, просто опустите каналы и запустите: Get-NetIPAddress -IPAddress '192.168.2.4'
,
Другие свойства, относящиеся к сетевому адаптеру (например, описание), обычно могут запрашиваться на основе InterfaceAlias
или же InterfaceIndex
Например:
Get-NetAdapter -InterfaceAlias Wi-Fi | %{$_.InterfaceDescription};
Который даст что-то вроде: Intel(R) Dual Band Wireless-AC 8265
,
Подробнее читайте в документации: https://docs.microsoft.com/en-us/powershell/module/nettcpip/get-netipaddress?view=win10-ps
Откройте cmd от имени администратора
netsh interface show interface