Board logo

标题: [系统相关] [已解决]批处理为何获取不到正确的本地连接IP? [打印本页]

作者: q120072949    时间: 2010-9-20 13:49     标题: [已解决]批处理为何获取不到正确的本地连接IP?

当我没有连接VPN时可以获取到正确的内网IP,比如我局域网IP是192.168.1.11
但我连接了VPN虚拟专用网路连接后,获取到的地址成了外网IP,代码要怎么样修改??
  1. @echo off FOR /f "tokens=2 delims=:" %%i in ('ipconfig^|find/i "ip address"') do Set IP=%%i
  2. echo IP:%IP%
  3. pause
复制代码
获取结果是192.168.1.11,但拨VPN后怎么都得不到这个结果,得到的是打开IP138显示的外网IP
我想在不断开VPN的情况下获取到本地连接的局域网地址192.168.1.11

[ 本帖最后由 q120072949 于 2011-3-11 09:47 编辑 ]
作者: batman    时间: 2010-9-20 14:38

请在连接上vpn运行后将ipconfig /all的结果贴出来
作者: q120072949    时间: 2010-9-20 15:04

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>ipconfig/all

Windows IP Configuration

        Host Name . . . . . . . . . . . . : PCPCPCPCPCPCPCPCPCPC
        Primary Dns Suffix  . . . . . . . :
        Node Type . . . . . . . . . . . . : Mixed
        IP Routing Enabled. . . . . . . . : No
        WINS Proxy Enabled. . . . . . . . : No

Ethernet adapter 本地连接:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : Realtek PCIe GBE Family Controller
        Physical Address. . . . . . . . . : 00-30-67-47-66-C8
        Dhcp Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 192.168.1.11
        Subnet Mask . . . . . . . . . . . : 255.255.0.0
        Default Gateway . . . . . . . . . : 192.168.1.1
        DNS Servers . . . . . . . . . . . : 202.101.224.68
                                            202.101.224.69

PPP adapter VPN:

        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
        Physical Address. . . . . . . . . : 00-53-45-00-00-00
        Dhcp Enabled. . . . . . . . . . . : No
        IP Address. . . . . . . . . . . . : 169.254.33.10
        Subnet Mask . . . . . . . . . . . : 255.255.255.255
        Default Gateway . . . . . . . . . : 169.254.33.10
        DNS Servers . . . . . . . . . . . : 203.141.128.33
                                            203.141.128.34

C:\Documents and Settings\Administrator>
作者: batman    时间: 2010-9-20 15:17     标题: 以下是不通用解法

  1. @echo off
  2. for /f "tokens=2 delims=:" %%a in ('ipconfig /all^|findstr /c:"IP Address"') do if not defined ip set "ip=%%a"
  3. echo IP:%ip:~1%
  4. pause>nul
复制代码

作者: q120072949    时间: 2010-9-20 16:05

膜拜啊,高人!
谢谢版主了!!
不通用解决方式意思是有时行不通么,我在自己电脑上弄好了,在另一台上面还是获取的外网IP哦,我搞不明白,
那台机器的IP:

Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.

C:\Documents and Settings\Administrator>ipconfig/all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : vm010
   Primary Dns Suffix  . . . . . . . :
   Node Type . . . . . . . . . . . . : Unknown
   IP Routing Enabled. . . . . . . . : Yes
   WINS Proxy Enabled. . . . . . . . : Yes

PPP adapter RAS Server (Dial In) Interface:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
   Physical Address. . . . . . . . . : 00-53-45-00-00-00
   DHCP Enabled. . . . . . . . . . . : No
   IP Address. . . . . . . . . . . . : 169.254.15.61
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . :

Ethernet adapter 本地连接:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Intel(R) PRO/1000 MT Network Connection
   Physical Address. . . . . . . . . : 00-0C-29-7F-42-39
   DHCP Enabled. . . . . . . . . . . : No
   IP Address. . . . . . . . . . . . : 192.168.6.110
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :
   DNS Servers . . . . . . . . . . . : 203.141.128.33
                                       203.141.128.34

PPP adapter pppoe_native_wan_miniport:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
   Physical Address. . . . . . . . . : 00-53-45-00-00-00
   DHCP Enabled. . . . . . . . . . . : No
   IP Address. . . . . . . . . . . . : 125.198.93.91
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . : 0.0.0.0
   DNS Servers . . . . . . . . . . . : 202.225.94.247
                                       210.147.240.193
   NetBIOS over Tcpip. . . . . . . . : Disabled

C:\Documents and Settings\Administrator>
作者: q120072949    时间: 2010-9-20 16:12

获取结果是
IP:169.254.15.61

但这台机器上IP138得到的IP却是:125.198.93.91

批处理获取到的IP在IPCONFIG/ALL里又成了第一个IP Address.
本地IP是192.168.6.110
得到的是第一个IP Address信息,
批处理能否识别出"本地连接"这个名字??电脑上有可能有VPN,PPTP,PPP,ADSL等
作者: batman    时间: 2010-9-20 16:24     标题: 呵呵,本来想偷下懒的。。。

以下是通用解决方法:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1,2 delims=:" %%a in ('ipconfig /all') do (
  3.      if "%%a" equ "Ethernet adapter 本地连接" set "flag=a"
  4.      if defined flag set /a n+=1
  5.      if !n! equ 7 set "ip=%%b"
  6. )
  7. echo IP:%ip:~1%
  8. pause>nul
复制代码

作者: q120072949    时间: 2010-9-20 16:39

版主就是牛,呵呵,第一次的代码也没有偷懒啦!
各有千秋,各有利弊.
比如说当机器都是象第一种那样,只有本地连接(名字可能不是为:本地连接1或者本地连接2)和VPN的话
第一次的代码是对的,
如果名字都是"本地连接",那第一种第二种都是对的

可如果机器有双网卡,网线这次插的口不一样,本地连接成了"本地连接2"."本地连接3"之类的
那么第一种获取到的不是内网IP,第二种获取到的结果是:IP:~1(空值,呵呵)

批处理可以判断连接的类型么,比如不管本地连接还是本地连接1.2.3,前面一定有一行标识:Ethernet adapter
能否读取这个Ethernet adapter后面的IP Address值,这个IP Address值应该没有上面尴尬的意外出现吧
这样就算你把VPN名字改成"本地连接",但IPCONFIG/ALL显示的Ethernet adapter里的IP Address值就永远都是内网IP
哪怕有多网卡,或者ADSL,VPN什么的名字是"本地连接"也没关系

当然这是我的一点小想法,我刚刚接触批处理,上面2种代码我都学习了,已经可以满足我现在的要求了,呵呵,谢谢老版啦!
作者: q120072949    时间: 2010-9-20 16:44

这个是显示出所有连接的IP,
http://www.bathome.net/thread-8949-1-19.html

for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do echo %%i

呵呵,只要内网IP就可以了
作者: batman    时间: 2010-9-20 16:51     标题: 回复 8楼 的帖子

如果是多网卡,电脑是无法识别那个网卡是你需要获取的内网ip的(除非事先有规则),唉,电脑最终是不及人脑的。
作者: q120072949    时间: 2010-9-20 16:56

原帖由 batman 于 2010-9-20 16:51 发表
如果是多网卡,电脑是无法识别那个网卡是你需要获取的内网ip的(除非事先有规则),唉,电脑最终是不及人脑的。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

呵呵,老版误会我的意思了,这么说把,如果机器就一块网卡,但本地连接并不是叫"本地连接",或者VPN和ADSL被改成了本地连接
不管名字怎么修改,在CMD里运行IPCONFIG/ALL得到的结果中,Ethernet adapter后面的IP Address值始终是内网IP,

能否读取这个Ethernet adapter后面的IP Address值,这个IP Address值应该没有上面尴尬的意外出现吧
这样就算你把VPN名字改成"本地连接",但IPCONFIG/ALL显示的Ethernet adapter里的IP Address值就永远都是内网IP
或者网卡不叫本地连接,ADSL,VPN什么的名字是"本地连接"也没关系

这样的话就不局限于网线插上后网卡显示名字,得到的代码始终是内网IP
作者: batman    时间: 2010-9-20 17:01

如果有三片或三片以上的网卡呢(其中只有一片是连接外网的,其他的都是连接内网的)
作者: q120072949    时间: 2010-9-20 17:45

对的,每个连接后面都有IP Address信息

5楼就是有3个连接,Ethernet adapter后面的IP Address就是内网IP信息啊,只需要读取这个后面的IP Address
作者: q120072949    时间: 2010-9-20 18:30

难道版主的意思是:IPCONFIG/ALL里面的Ethernet adapter不一定表示本地连接???
或者说本地连接在IPCONFIG/ALL里面不一定叫做Ethernet adapter
那么Ethernet adapter这个是什么意思?百度得到的是:以太网适配器,通俗说就是网卡

就按照Ethernet adapter是本地连接内网IP,怎么获取到Ethernet adapter后面的IP Address

而不是获取其他的比如:
Windows IP Configuration
PPP adapter RAS Server (Dial In) Interface
PPP adapter pppoe_native_wan_miniport
.......
之类

只需要得到Ethernet adapter后面的IP Address即可
作者: q120072949    时间: 2010-9-21 13:19

这个问题我还是没弄好
不知道怎么得到Ethernet adapter后面的IP Address
- -!
作者: Batcher    时间: 2010-9-21 13:32     标题: 回复 15楼 的帖子

  1. @echo off
  2. ipconfig /all>"%temp%\ipList.txt"
  3. for /f "tokens=1 delims=:" %%a in ('findstr /n "Ethernet adapter" "%temp%\ipList.txt"') do (
  4.     set SkipRow=%%a
  5.     goto :DoSkip
  6. )
  7. :DoSkip
  8. for /f "usebackq skip=%SkipRow% tokens=1,15" %%a in ("%temp%\ipList.txt") do (
  9.     if "%%a" equ "IP" (
  10.         set IP=%%b
  11.         goto :ShowResult
  12.     )
  13. )
  14. :ShowResult
  15. echo,%IP%
复制代码

作者: q120072949    时间: 2010-9-21 18:29     标题: 批处理如何获取指定行后面的值

首先看一段IPCONFIG/ALL得到的信息:
Microsoft Windows [版本 5.2.3790]
(C) 版权所有 1985-2003 Microsoft Corp.

C:\Documents and Settings\Administrator>ipconfig/all

Windows IP Configuration

   Host Name . . . . . . . . . . . . : vm010
   Primary Dns Suffix  . . . . . . . :
   Node Type . . . . . . . . . . . . : Unknown
   IP Routing Enabled. . . . . . . . : Yes
   WINS Proxy Enabled. . . . . . . . : Yes

PPP adapter RAS Server (Dial In) Interface:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
   Physical Address. . . . . . . . . : 00-53-45-00-00-00
   DHCP Enabled. . . . . . . . . . . : No
   IP Address. . . . . . . . . . . . : 169.254.15.61
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . :

Ethernet adapter 本地连接:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Intel(R) PRO/1000 MT Network Connection
   Physical Address. . . . . . . . . : 00-0C-29-7F-42-39
   DHCP Enabled. . . . . . . . . . . : No
   IP Address. . . . . . . . . . . . : 192.168.6.110
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :
   DNS Servers . . . . . . . . . . . : 203.141.128.33
                                       203.141.128.34

PPP adapter pppoe_native_wan_miniport:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : WAN (PPP/SLIP) Interface
   Physical Address. . . . . . . . . : 00-53-45-00-00-00
   DHCP Enabled. . . . . . . . . . . : No
   IP Address. . . . . . . . . . . . : 125.198.93.91
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . : 0.0.0.0
   DNS Servers . . . . . . . . . . . : 202.225.94.247
                                       210.147.240.193
   NetBIOS over Tcpip. . . . . . . . : Disabled

C:\Documents and Settings\Administrator>

上面有几个连接:
Windows IP Configuration
PPP adapter RAS Server (Dial In) Interface:
Ethernet adapter 本地连接:
PPP adapter pppoe_native_wan_miniport:

每个连接后面都带有一个IP Address信息
我只想获取Ethernet adapter这个连接后面的IP Address信息
需要注意的是这个连接可能为
“Ethernet adapter 本地连接1:”“Ethernet adapter 本地连接2:”
甚至“Ethernet adapter 1234:”

即Ethernet adapter 后面的内容不确定,能否用批处理获取到“Ethernet adapter xxx:”(XXX为未知内容)后面的IP Address信息呢?
参考帖子:
http://www.bathome.net/thread-9361-1-1.html
作者: q120072949    时间: 2010-9-21 18:41

如上面内容里的中,我想获取的IP Address是192.168.6.110,但IP Address的个数不限
也就是说不管有几个连接,不一定是下面的4个
Windows IP Configuration
PPP adapter RAS Server (Dial In) Interface:
Ethernet adapter 本地连接:
PPP adapter pppoe_native_wan_miniport:

可能只有1个或者5个和更多,获取第三个IP Address值不可取
只要获取到的是“Ethernet adapter xxx:”(XXX为未知内容)后面的IP Address信息
那肯定是我想要的
作者: vsbat    时间: 2010-9-21 19:38

  1. @echo off
  2. cd.>result.txt
  3. set flag=vsbat
  4. for /f "delims=" %%i in (1.txt) do (
  5. if  defined flag (
  6. echo "%%i"|findstr /c:"Ethernet adapter" && set flag=
  7. ) else (
  8. echo %%i|findstr /c:"IP Address"  && (set "t= %%i" & goto :DEAL)
  9. )
  10. )
  11. goto :END
  12. :DEAL
  13. for /f "tokens=2 delims=:" %%i in ("%t%") do echo %%i >> result.txt
  14. echo 成功提取!
  15. :END
  16. pause
复制代码

作者: q120072949    时间: 2010-9-25 17:39     标题: 回复 16楼 的帖子

第二行少个东西,哈哈
ipconfig/all>1.txt
作者: q120072949    时间: 2010-9-25 17:42

谢谢batcher和vsbat,们两个的代码都不错,已经达到了这个目的,

谢谢batman,的耐心解答,你的思路很宽广,你的代码已经解决我的那个问题,只是我有点完美心里作怪哈!
作者: q120072949    时间: 2010-9-25 17:42

这个论坛还是不错的!
作者: cjiabing    时间: 2010-9-25 19:10     标题: 回复 1楼 的帖子

echo 不在括号内时只获取FOR最后一个循环,要获取所有需加括号:
do (
Set IP=%%i
echo IP:%IP%
)
使用“ipconfig all”可能会获得更多信息,但不一定全部有用。
作者: q120072949    时间: 2011-1-22 11:57

翻出老帖来学习下!!!
作者: loongchip    时间: 2018-9-20 00:08

感谢各位,学习一下




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2