Как мне получить IP-адрес в переменную пакетного файла? - PullRequest
43 голосов
/ 05 мая 2011

У меня странный вопрос, но я не уверен, что это возможно.

Я хотел бы написать скрипт, и, например, я собираюсь использовать ipconfig в качестве моей команды.

Теперь, когда вы обычно запускаете эту команду, у вас есть тонна вывода.

То, что я хотел бы иметь, это скрипт, который будет показывать только IP-адрес, например.

echo Network Connection Test
ipconfig <---This would run in the background
echo Your IP Address is: (INSERT IP ADDRESS HERE)

вывод будет

Network Connection Test

Your IP Address is: 192.168.1.1

Возможно ли это вообще?

Ответы [ 17 ]

47 голосов
/ 14 июля 2013

Следующий код работает на любой локали любой платформы, начиная с Windows XP , и ищет сетевой IP от (более или менее) случайного числа ваших сетевых карт. Это никогда не займет больше времени, чем несколько миллисекунд.

for /f "delims=[] tokens=2" %%a in ('ping -4 -n 1 %ComputerName% ^| findstr [') do set NetworkIP=%%a
echo Network IP: %NetworkIP%

Следующий код ищет ваш общедоступный IP-адрес и работает на Windows 7 и более новых компьютерах.

for /f %%a in ('powershell Invoke-RestMethod api.ipify.org') do set PublicIP=%%a
echo Public IP: %PublicIP%  

Подробные объяснения этих команд вы можете найти в моем блоге .

39 голосов
/ 05 мая 2011

Это напечатает IP-адреса на выходе ipconfig:

@echo off
set ip_address_string="IPv4 Address"
rem Uncomment the following line when using older versions of Windows without IPv6 support (by removing "rem")
rem set ip_address_string="IP Address"
echo Network Connection Test
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do echo Your IP Address is: %%f

Чтобы напечатать только первый IP-адрес, просто добавьте goto :eof (или другую метку для перехода вместо :eof) после эха или в более читаемой форме:

set ip_address_string="IPv4 Address"
rem Uncomment the following line when using older versions of Windows without IPv6 support (by removing "rem")
rem set ip_address_string="IP Address"
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do (
    echo Your IP Address is: %%f
    goto :eof
)

Более настраиваемый способ - это немного разобрать вывод ipconfig /all, чтобы вы могли даже указать адаптер, IP-адрес которого вы хотите:

@echo off
setlocal enabledelayedexpansion
::just a sample adapter here:
set "adapter=Ethernet adapter VirtualBox Host-Only Network"
set adapterfound=false
echo Network Connection Test
for /f "usebackq tokens=1-2 delims=:" %%f in (`ipconfig /all`) do (
    set "item=%%f"
    if /i "!item!"=="!adapter!" (
        set adapterfound=true
    ) else if not "!item!"=="!item:IP Address=!" if "!adapterfound!"=="true" (
        echo Your IP Address is: %%g
        set adapterfound=false
    )
)
16 голосов
/ 23 декабря 2012

В Windows 7:

for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set ip=%ip:~1%
echo %ip%
pause
12 голосов
/ 13 марта 2014
@echo off

FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i

echo Your IP Address is: %localIp%
12 голосов
/ 05 мая 2011

Самостоятельное извлечение адреса немного сложнее, но вы можете легко получить всю строку IP-адреса.

Чтобы отобразить все IP-адреса в любой англоязычной ОС Windows:

ipconfig | findstr /R /C:"IP.* Address"

Чтобы отобразить только адреса IPv4 или IPv6 в Windows 7 +:

ipconfig | findstr /R /C:"IPv4 Address"

ipconfig | findstr /R /C:"IPv6 Address"

Ниже приведен пример вывода с компьютера XP с 3 сетевыми адаптерами.

        IP Address. . . . . . . . . . . . : 192.168.1.10
        IP Address. . . . . . . . . . . . : 10.6.102.205
        IP Address. . . . . . . . . . . . : 192.168.56.1
4 голосов
/ 12 ноября 2013

Это работает, даже если у вас есть виртуальные сетевые адаптеры или VPN-подключения:

FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i
echo Your IP Address is: %localIp%
3 голосов
/ 08 марта 2013

Это модификация ответа @ mousio. Мое сетевое соединение не является постоянным, поэтому отображается IP-адрес следующего адаптера, если в ipconfig отсутствует строка «IPv4-адрес». Результат ipconfig имеет 2 пробела между адаптерами. После того, как адаптер найден и перед текстом «IPv4-адрес» появляются 2 пустые строки, он предполагает, что он отсутствует. Протестировано только в 64-разрядной версии Windows 7.

Обработка пустых строк из ответа @ dbenham в: Пакет DOS для цикла FOR с FIND.exe удаляет пустые строки?

@echo off

rem --- complete adapter name to find without the ending ":" ---
set adapter=Wireless LAN adapter Wireless Network Connection

rem --- token under an adapter to extract IP address from ---
set IPAddrToken=IPv4 Address

setlocal enableextensions enabledelayedexpansion
set adapterfound=false
set emptylines=0
set ipaddress=

for /f "usebackq tokens=1-3 delims=:" %%e in (`ipconfig ^| findstr /n "^"`) do (

    set "item=%%f"

    if /i "!item!"=="!adapter!" (
        set adapterfound=true
        set emptylines=0
    ) else if not "!item!"=="" if not "!item!"=="!item:%IPAddrToken%=!" if "!adapterfound!"=="true" (
        @rem "!item:%IPAddrToken%=!" --> item with "IPv4 Address" removed
        set ipaddress=%%g
        goto :result
    )
    if "%%f-%%g-!adapterfound!-!emptylines!"=="--true-1" (
        @rem 2nd blank line after adapter found
        goto :result
    )
    if "%%f-%%g-!adapterfound!-!emptylines!"=="--true-0" (
        @rem 1st blank line after adapter found
        set emptylines=1
    )
)

endlocal

:result
    echo %adapter%
    echo.
    if not "%ipaddress%"=="" (
        echo    %IPAddrToken% =%ipaddress%
    ) else (
        if "%adapterfound%"=="true" (
            echo    %IPAddrToken% Not Found
        ) else (
            echo    Adapter Not Found
        )
    )
    echo.

pause
2 голосов
/ 04 ноября 2012

Использование IPCONFIG хорошо, если только вам не нужна гибкость получения IP-адреса удаленного хоста в дополнение к локальному хосту.Чтобы получить что-то вроде www.google.com с помощью PING, попробуйте:

for /f "tokens=2 delims=[]" %%f in ('ping -4 -n 1 www.google.com ^|find /i "pinging"') do echo IP=%%f

Результат для этого примера:

IP=173.194.73.106

Чтобы получить первый IP-адрес вашего локальногохост, замените "www.google.com" на "% computername%" без кавычек.Обратите внимание, что «-4» перед всегда будет получать адрес IPv4 вместо возможного адреса IPv6.Опускать по мере необходимости.Также обратите внимание, что этот метод не может получить более одного IP-адреса.Если это ваша цель, вам нужно использовать NSLOOKUP с некоторым дополнительным кодом.

Имейте в виду, что если вы используете NSLOOKUP вместо PING, а у хоста более одного IP-адреса, то ваша переменная будет иметьзапятая в конце, так как каждый адрес будет разделяться запятой.

2 голосов
/ 15 июля 2012

Я знаю, что это старый пост, но я столкнулся с этим, пытаясь решить ту же проблему в VBScript. Я не проверял это с несколькими сетевыми адаптерами, но надеюсь, что это все-таки полезно.

for /f "delims=: tokens=2" %%a in ('ipconfig ^| findstr /R /C:"IPv4 Address"') do (set tempip=%%a)  
set tempip=%tempip: =%  
echo %tempip%

Это предполагает Win7. Для XP замените IPv4 Address на IP Address.

1 голос
/ 17 января 2016

В среде Linux:

ip="$(ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -d ':' -f 2)"

или

ip="$(ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -d ':' -f 2)" | echo $ip

пример во FreeBSD:

ifconfig re0 | grep -v "inet6" | grep -i "inet" | awk '{print $2}'

Если у вас настроено более одного IP-адреса, у вас будет более одного IP-адреса в stdout.

...