如何将IP地址转换为批处理文件变量?

时间:2011-05-05 13:47:41

标签: batch-file ip

我有一个奇怪的问题,不确定它是否可能。

我想编写一个脚本,例如我将使用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

这甚至可能吗?

20 个答案:

答案 0 :(得分:46)

以下代码适用于自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%  

您可以在my blog上找到有关这些命令的详细说明。

答案 1 :(得分:38)

这将在ipconfig

的输出中打印IP地址
@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
    )
)

答案 2 :(得分:16)

在Windows 7中:

for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set ip=%ip:~1%
echo %ip%
pause

答案 3 :(得分:12)

单独提取地址有点困难,但您可以轻松获取整个IP地址行。

要在任何英语Windows操作系统上显示所有IP地址:

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

在Windows 7 +上仅显示IPv4或IPv6地址:

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

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

以下是带有3个网络适配器的XP机器的一些示例输出。

        IP Address. . . . . . . . . . . . : 192.168.1.10
        IP Address. . . . . . . . . . . . : 10.6.102.205
        IP Address. . . . . . . . . . . . : 192.168.56.1

答案 4 :(得分:12)

@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%

答案 5 :(得分:4)

即使你有虚拟网络适配器或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%

答案 6 :(得分:3)

这是@ mousio答案的修改。我的网络连接不是持久的,因此如果ipconfig中缺少字符串“IPv4 Address”,则会显示下一个适配器的IP地址。 ipconfig的结果在适配器之间有2个空格。找到适配器并在“IPv4地址”文本之前出现2个空行后,它会认为它已丢失。仅在Windows 7 64位上测试。

从@ dbenham的回答处理空行: DOS batch FOR loop with FIND.exe is stripping out blank lines?

@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

答案 7 :(得分:2)

我知道这是一篇较旧的帖子,但我试图在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

答案 8 :(得分:2)

使用IPCONFIG是好的,除非您希望获得除本地主机之外的远程主机IP的灵活性。要使用PING从www.google.com获取此功能,请尝试:

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地址,那么您的变量最后会有一个逗号,因为每个地址都会用逗号分隔。

答案 9 :(得分:1)

假设您提到的Windows操作系统 p config

如果你愿意安装一些Unixy实用程序,比如grep的windows-port和cut,你可以这样做。但是,在像ipconfig这样的情况下,在具有多个NIC或VMWare的机器中会出现问题。

Powershell可能是您想要的工具,请查看here示例。

答案 10 :(得分:1)

Windows中的一行命令以获取IP地址。

for /F "tokens=14" %%i in ('"ipconfig | findstr IPv4"') do SET LOCAL_IP=%%i

此命令后,echo %LOCAL_IP%将打印IP地址。或者,您可以在批处理脚本中使用%LOCAL_IP%作为参考变量

答案 11 :(得分:1)

在linux环境中:

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

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

FreeBSD中的例子:

strings.TrimSpace(cmd[3])

如果您配置了多个IP地址,则stdout中将有多个IP地址。

答案 12 :(得分:0)

下面的脚本会将ip地址存储到变量ip_address

@echo off

call :get_ip_address
echo %ip_address%

goto :eof

REM
REM get the ip address
REM
:get_ip_address
FOR /f "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') do (FOR /F "tokens=3 delims= " %%g IN ("%%d") DO set ip_address=%%g)

goto :eof

来自this blog post的想法。

答案 13 :(得分:0)

以下内容全部在Windows XP盒子上的cygwin中完成。

这将获得您的IP地址。请注意,hostname命令周围有反引号,而不是单引号。

ping -n 1 `hostname` | grep "Reply from " | cut -f 3 -d " " | cut -f 1 -d ":"

这将获得您的子网。

ping -n 1 `hostname` | grep "Reply from " | cut -f 3 -d " " | cut -f "1 2 3" -d "."

以下将列出本地网络上的所有主机(将其放入名为“netmap”的脚本中)。我已经把上面的子网线放到一个名为“getsubnet”的可执行文件中,然后我从下面的脚本中调用它。

MINADDR=0
MAXADDR=255
SUBNET=`getsubnet`

hostcnt=0

echo Pinging all addresses in ${SUBNET}.${MINADDR}-${MAXADDR}

for i in `seq $MINADDR $MAXADDR`; do
addr=${SUBNET}.$i
ping -n 1 -w 0 $addr > /dev/null

if [ $? -ne 1 ]    
then    
echo $addr UP    
hostcnt=$((hostcnt+1))    
fi

done

echo Found $hostcnt hosts on subnet ${SUBNET}.${MINADDR}-${MAXADDR}

答案 14 :(得分:0)

您使用ipconfig命令获取IPv4。

帮助链接= for /?

Help = ipconfig /?

这是我的方式=

for /f "tokens=1-2 delims=:" %%a in ('ipconfig ^|find "IPv4"') do set Oo=%%b
Echo %Oo%
cd "%ProgramFiles%\Mozilla Firefox"
Firefox.exe %Oo%

答案 15 :(得分:0)

tldr;

在用例中,我无法使用以上任何答案,因此我使用以下命令来获取以太网网络适配器的ip地址,并按上述问题中所述回显它。

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do echo Your IP Address is: %i

对于那些想知道所有含义的人,请继续阅读

例如,大多数使用ipconfig的命令只会打印出您的所有IP地址,而我需要一个特定的地址,在我的情况下,该地址用于我的以太网适配器。

您可以使用netsh interface ipv4 show interfaces命令查看网络适配器列表。大多数人需要Wi-Fi或以太网。

在命令提示符的输出中,您将看到一个类似这样的表:

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 15          25        1500  connected     Ethernet
 17        5000        1500  connected     vEthernet (Default Switch)
 32          15        1500  connected     vEthernet (DockerNAT)

在名称列中,您应该找到所需的网络适配器(即以太网,Wi-Fi等)。

如前所述,我对Ethernet感兴趣。

要获取该适配器的IP,我们可以使用netsh命令:

netsh interface ip show config name="Ethernet"

这给了我们这个输出:

Configuration for interface "Ethernet"
    DHCP enabled:                         Yes
    IP Address:                           169.252.27.59
    Subnet Prefix:                        169.252.0.0/16 (mask 255.255.0.0)
    InterfaceMetric:                      25
    DNS servers configured through DHCP:  None
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None

(出于安全原因?,我伪造了上述实际IP地址)

我可以在ms-dos命令提示符下使用findstr命令进一步指定要在哪一行。 在这里,我需要包含字符串IP Address的行。

netsh interface ip show config name="Ethernet" | findstr "IP Address"

这将提供以下输出:

 IP Address:                           169.252.27.59

然后,我可以使用for命令,该命令使我可以分析文件(在这种情况下为多行字符串),并根据分隔符和我感兴趣的项目编号来拆分字符串的内容。

请注意,我正在寻找第三个项目(令牌= 3),并且我使用空格字符和:作为分隔符(delims=:)。

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do echo Your IP Address is: %i

循环中的每个值或令牌都作为变量%i打印出来,但是我只对第三个“令牌”或项感兴趣(因此tokens=3)。请注意,我必须使用|

转义=^

for命令的末尾,您可以指定要与返回的内容一起运行的命令。在这种情况下,我使用echo将其与其他一些文本一起打印出来,但是您也可以使用do set IP=%i将该值分配给一个环境变量,例如,或者根据您的喜好。

很整洁吧?

如果您有任何改进的想法,请发表评论。我很想听听:)或者您也可以编辑。

答案 16 :(得分:0)

对于我的系统,我有许多IPv4地址,其中只有一个是正确的。整理和检查它的简单方法如下:

for /f "tokens=1,2* delims=:" %%A in ('ipconfig ^| find "IPv4 Address"') do (
    set "tempip=%%~B"
    set "tempip=!tempip: =!"
    ping !tempip! -n 1 -w 50
    if !errorlevel!==0 (
        set localip=!tempip!
        goto foundlocal
    )
)
:foundlocal

答案 17 :(得分:0)

如果要使用PowerShell或WSL2 bash:

我只是基于this answer on superuser
但是我发现以下选择更清晰的方式来获取我的LAN IP地址:

  1. 找到要了解的接口名称
    对我来说是Configuration for interface "Wi-Fi"
    所以对我来说,名字叫Wi-Fi
    (用下面的界面名称替换下面命令中的"Wi-Fi"

  2. PowerShell:

    $myip = netsh interface ip show address "Wi-Fi" `
      | where { $_ -match "IP Address"} `
      | %{ $_ -replace "^.*IP Address:\W*", ""}
    
    echo $myip
    

    输出:192.168.1.10

  3. 或者,以我为例,在WSL2中执行命令:

    netsh.exe interface ip show address "Wi-Fi" \
       | grep 'IP Address' \
       | sed -r 's/^.*IP Address:\W*//'
    
    # e.g.
    export REACT_NATIVE_PACKAGER_HOSTNAME=$(netsh.exe interface ip show address "Wi-Fi" \
       | grep 'IP Address' \
       | sed -r 's/^.*IP Address:\W*//')
    

答案 18 :(得分:-1)

如果你只是想要ip地址,试试这个:

#Variable to store ip address
ipaddr=$(hostname -I)

echo "$ipaddr"

答案 19 :(得分:-1)

尝试这样的事情

echo "yours ip addresses are:"
ifconfig | grep "inet addr" | cut -d':' -f2 | cut -d' ' -f1

linux like systems