返回列表 发帖

[原创] 批处理和VBS获取本机外网IP方法汇总

本帖最后由 batman 于 2013-9-6 23:39 编辑

&&&&获取本机外网IP的方法有很多种,我在这里把自己知道的几种方法写出来,以方便大家查询。也欢迎大家跟帖补充。
&&&&第一种方法,批处理从IPCONFIG执行信息中获取:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in ('ipconfig') do (
  set "str=%%a"
  if not defined ip (
    if defined flag (
      if "!str:IP Address=!" neq "!str!" (
        set "ip=!str:*:=!"
        set "ip=!ip:~1!"
      )
    )
    if "!str:~,3!" equ "PPP" set "flag=a"
  )
)
echo,%ip%
pause>nulCOPY
&&&&第二种方法,批处理从WMIC NICCONFIG执行信息中获取:
@echo off
for /f "tokens=2 delims={}" %%a in ('^(wmic nicconfig where "ipenabled='true'" get caption^,ipaddress^)^|find /i "WAN"') do set "ip=%%~a"
echo,%ip%
pause>nulCOPY
&&&&第三种方法,VBS通过WMI从NetworkAdapterConfiguration组件信息中获取(类似于第二种方法):
Dim objWMI, objItems, objItem
Set objWMI = GetObject("Winmgmts:")
Set objItems = objWMI.ExecQuery _
("Select * From Win32_NetworkAdapterConfiguration " _
   & "Where IpEnabled = True")
For Each objItem In objItems
  If InStr(objItem.Caption, "WAN") Then
    For Each ip In objItem.IpAddress
      WScript.Echo ip
    Next
  End If
Next
Set objItems = Nothing
Set objWMI = NothingCOPY
&&&&第四种方法,VBS调用IE对象从网页节点元素中获取:
Dim objIE, Url, Text
Set objIE = CreateObject("Internetexplorer.Application")
Url = "http://iframe.ip138.com/ic.asp"
objIE.Visible = False
objIE.Navigate Url
Do Until objIE.ReadyState = 4
  WScript.Sleep 200
Loop
Text = objIE.Document.DocumentElement.InnerText
objIE.Quit
Set objIE = Nothing
Dim objREG, Ip
Set objREG = New RegExp
objREG.Pattern = ".*?(\d{1,}\.\d{1,}\.\d{1,}\.\d{1,}).*"
Ip = objREG.Replace(Text, "$1")
Set objREG = Nothing
WScript.Echo IpCOPY
&&&&第五种方法,VBS调用DOM组件从网页节点元素中获取(同于第四种方法):
Dim objDOM, Url, Text, Ip
Url = "http://iframe.ip138.com/ic.asp"
Set objDOM = WScript.GetObject(Url)
Do Until objDOM.ReadyState = "complete"
  WScript.Sleep 200
Loop
Text = objDOM.DocumentElement.InnerText
Set objDOM = Nothing
Ip = Split(Split(Text, "[")(1), "]")(0)
WScript.Echo IpCOPY
&&&&以上五种方法各有优劣,其中第一到第三种方法仅适合拔号连接网络,第四和第五种适合各种网络连接,但是如果你的浏览器不是默认为IE的话,第四种可能会出现访问不了的情况,同时第五种在你的网络安全级别较高的情况下,就有可能弹出警告或直接被限制访问而获取失败。有许有人会说还有从TRACERT和ROUTE PRINT中获取的方法,我可以告诉你,TRACERT中获取到的外网IP并不是你真正的IP,而ROUNTE PRINT中可以看到外网IP,却没有办法用程序来判断哪个是外网IP(至少我是没有办法)。同时声明一下,这些代码本人仅在XP和2003下测试过,如大家发现问题请提出来,我也好及时修正代码。
***共同提高***

@echo off
echo,请稍等...
>Getip.vbs echo Set oDOM=WScript.GetObject("http://iframe.ip138.com/ic.asp"):Do Until oDOM.readyState="complete":WScript.sleep 1:Loop:WScript.echo oDOM.documentElement.outerText:Set oDOM=nothing
for /f "tokens=2,3 delims=[]" %%i in ('"cscript //nologo Getip.vbs"') do echo 当前外网 IP 是: %%i %%j
del Getip.vbs
pauseCOPY
这个网上找来的,也不错。

TOP

回复 2# 522235677


    这不就是我说的第五种方法?
***共同提高***

TOP

回复 3# batman


    嗯,你的好像直接就能把IP截取出来了

TOP

VBS 调用 Msxml2.ServerXMLHTTP 获取网页上的地址信息
' getIP.vbs
Msgbox "外网IP为:" & getIP()
Function getIP()
    Dim strHtml, strIP
    If strIP = "" Then
        strHtml = HttpGet("http://yu2n.sinaapp.com/app/f/ip/AddIP.php?ip=show_client")
        strIP = Join(regEx_execute("\d+\.\d+\.\d+\.\d+", strHtml))
    End If
    If strIP = "" Then
        strHtml = HttpGet("http://iframe.ip138.com/ic.asp")
        strIP = Join(regEx_execute("\d+\.\d+\.\d+\.\d+", strHtml))
    End If
    If strIP = "" Then
        strHtml = HttpGet("http://www.whereismyip.com/")
        strIP = Join(regEx_execute("\d+\.\d+\.\d+\.\d+", strHtml))
    End If
    getIP = strIP
End Function
Function HttpGet(ByVal url)
    With CreateObject("Msxml2.ServerXMLHTTP")
        .open "GET", url, False
        .send
        HttpGet = .responseText
    End With
End Function
' ====================================================================================================
' 检查字符串是否符合正则表达式
'Msgbox Join(regEx_execute( "[A-z]", "a-v d-f b-c"), " | ")
'Msgbox regEx_replace( "[A-z]+-[A-z]+", "a-v d-f b-c", " | ")
' 取得正则表达式搜索结果,返回数组
Function regEx_execute(ByVal sPattern, ByVal str)
    Dim regEx, Match, Matches, arrMatchs(), i : i = -1    ' 建立变量。
    Set regEx = CreateObject("VBScript.RegExp") ' 建立正则表达式。
        regEx.Pattern = sPattern      ' 设置模式。
        regEx.IgnoreCase = True    ' 设置是否区分字符大小写。
        regEx.Global = True        ' 设置全局可用性。
        regEx.MultiLine = True     ' 多行匹配模式
    Set Matches = regEx.Execute(str)      ' 执行搜索。
    For Each Match in Matches  ' 遍历匹配集合。
        If Not Match.Value = "" Then
            i = i + 1
            ReDim Preserve arrMatchs(i) ' 动态数组:数组随循环而变化
            arrMatchs(i) = Match.Value
        End If
    Next
    regEx_execute = arrMatchs
Set Match = Nothing
Set regEx = Nothing
End FunctionCOPY
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

用第5个代码,获取外网IP后,保存在TXT文件里,应该改什么地方

Dim objDOM, Url, Text, Ip
Url = "http://iframe.ip138.com/ic.asp"
Set objDOM = WScript.GetObject(Url)
Do Until objDOM.ReadyState = "complete"
  WScript.Sleep 200
Loop
Text = objDOM.DocumentElement.InnerText
Set objDOM = Nothing
Ip = Split(Split(Text, "[")(1), "]")(0)
WScript.Echo Ip
1

评分人数

TOP

本帖最后由 pcl_test 于 2019-5-8 21:32 编辑

回复 6# mingjianko
With CreateObject("Microsoft.XMLHTTP")
    .open "GET", "http://2019.ip138.com/ic.asp", False
    .send
    ip= Split(Split(.responseText, "[")(1),"]")(0)
End With
CreateObject("Scripting.FileSystemObject").CreateTextFile("IP.txt", 1).Write ipCOPY

TOP

返回列表