WINDOWS PROMPT Getting IP of webpages from file

断了今生、忘了曾经 提交于 2019-11-28 14:45:50

I know this is a PowerShell answer to a batch question, but I find that many people ask how to do things in batch when they are really just wanting a command line. If you are wanting to learn how to do things like this, learn PowerShell instead of batch as it is much easier to learn than the convoluted batch FOR command (my apologies to those of you who actually understand it).

get-content c:\temp\test.txt | foreach-object{ping ([System.Net.Dns]::GetHostAddresses("$_")[0].IPAddressToString)}

Next updated and commented code snippet is faster than code in my original answer:

@ECHO OFF
SETLOCAL enableextensions disabledelayedexpansion

set "_format=%~1"                   use for output ''beautifying''
if defined _format (
  echo        hostname OP IPv4_address    explanation
  echo        -------- -- ------------    -----------
)
set "_file=files\30852528.txt"      change to fit your circumstances

for /F "usebackq delims=" %%i in ("%_file%") do (
  set "_host=%%i"                   remember input line 

  for /F "tokens=1 delims==" %%G in ('set ___ping 2^>NUL') do set "%%G="

  set /A "_line=0" 
  for /F "delims=" %%G in ('ping -a -4 -n 1 %%i') do (
    set /A "_line+=1"
    call set "___ping%%_line%%=%%G" remember ping output to an array-like variable
  )
  REM   rem debug output in next two lines
  REM   echo(
  REM   for /F "tokens=1* delims==" %%G in ('set ___ping 2^>NUL') do echo(%%H
  call :pings
) 
ENDLOCAL
goto :eof

:pings
  set "_operator=??"
  set "_hostIPno=%_host%"
  set "_hostName=%_host%"
  set "_auxiliar="
  set "_explains=Unknown reason"    default values set

  set "_string=Ping request could not find host"
  for /F "delims=" %%G in ('set ___ping^|findstr /i /C:"%_string%"') do (
      set "_operator=##"
      set "_explains=%_string%"     ping request could not find host
      goto :pingsDone
  )

  set "_string==Pinging"
  for /F "tokens=1-4 delims==[] " %%G in ('set ___ping^|findstr /i /C:"%_string%"') do (
      echo("%%J"|findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*">NUL
      if errorlevel 1 (
          set "_auxiliar=%%H %%I"
      ) else (
          set "_auxiliar=%%H %%I [%%J]"
          set "_hostIPno=%%J"
          set "_hostName=%%I"       address to hostname resolved
      )
  )

  set "_string=Destination host unreachable"
  for /F "tokens=1* delims==" %%G in ('set ___ping^|findstr /i /C:"%_string%"') do (
      set "_explains=%%H"
      set "_operator=?="            destination host unreachable
  )

  set "_string=Request timed out"
  for /F "tokens=1* delims==" %%G in ('set ___ping^|findstr /i /C:"%_string%"') do (
      set "_explains=%_auxiliar%: %%H"
      set "_operator==?"            request timed out
  )

  set "_string=TTL="
  for /F "tokens=1* delims==" %%G in ('set ___ping^|findstr /i "%_string%"') do (
      set "_explains=%%H"
      set "_operator==="            ping request successful
  )
:pingsDone
  rem basic formatting: output to columns only for demonstration at StackOverflow
  if defined _format (
      set "_hostName=               %_hostName%"
      set "_hostIPno=%_hostIPno%               "
      set "_explains= %_explains%"
  ) else set "_explains="
  if defined _format (
      set "_hostName=%_hostName:~-15%"
      set "_hostIPno=%_hostIPno:~0,15%"
  )

  rem output with delayed expansion enabled:
  SETLOCAL enabledelayedexpansion
    echo(!_hostName! !_operator! !_hostIPno!!_explains!
  ENDLOCAL
goto :eof

Data:

d:\bat> type "files\30852528.txt"|findstr /V "^;"
foo.bar
google.com
77.75.79.53
192.168.1.1
192.168.1.12
bmw.com
160.46.244.131

Output (run from an open cmd window):

d:\bat> so\30852528.bat
foo.bar ## foo.bar
google.com == 216.58.209.206
www.seznam.cz == 77.75.79.53
192.168.1.1 == 192.168.1.1
192.168.1.12 ?= 192.168.1.12
bmw.com =? 160.46.244.131
origin.bmw.com =? 160.46.244.131

Beautified output:

d:\bat> so\30852528.bat 1
       hostname OP IPv4_address    explanation
       -------- -- ------------    -----------
        foo.bar ## foo.bar         Ping request could not find host
     google.com == 216.58.209.206  Reply from 216.58.209.206: bytes=32 time=24ms TTL=56
  www.seznam.cz == 77.75.79.53     Reply from 77.75.79.53: bytes=32 time=10ms TTL=248
    192.168.1.1 == 192.168.1.1     Reply from 192.168.1.1: bytes=32 time<1ms TTL=64
   192.168.1.12 ?= 192.168.1.12    Reply from 192.168.1.100: Destination host unreachable.
        bmw.com =? 160.46.244.131  Pinging bmw.com [160.46.244.131]: Request timed out.
 origin.bmw.com =? 160.46.244.131  Pinging origin.bmw.com [160.46.244.131]: Request timed out.
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!