批处理之输入起始Ip和结束Ip得到中间的Ip

 几日前一同事问我扫描一个Ip段的MSDOS命令,将不通的Ip导出。
for /l %a in (1,1,254) do ping 192.168.1.%a || echo 192.168.1.%a>>1.txt

于是兴趣大起,想写个只要输入起始Ip及结束Ip便可Ping中间的所有Ip的批处理,有点像IpScan的就是了(当然只是Ping而已)。
却不曾想还遇到麻烦了,因为IPv4有4段,我得让他(在我看在程序是有生命的)可以跨越C网段的障碍。举个例子
起始Ip:10.0.250.240
结束Ip:10.1.2.3
那么他就得可以从10.0.250.240遍历到10.0.250.254,再从10.0.251.1遍历到10.0.251.254……

起初我是按常规做法做的,即分别将起始Ip与结束Ip的四个网段提取出来,分别判断,比如(依上例):
10.0.250.240 VS 10.1.2.3
1比2小,所以得从10.0.x.x遍历10.0.255.254

最让人头晕的是批处理中的变量延迟和循环嵌套。以下是我用了 5天业余时间写的第一个版本并且问题还没有完美解决:

::code dy Flws(QQ:409947470)
::made date:2008年7月30日
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
cls
set /p s=请输入起始ip:
set /p e=请输入结束ip:
for /f "tokens=1-4 delims=." %%a in ("%s%") do set "s1=%%a" & set "s2=%%b" & set "s3=%%c" & set "s4=%%d"
for /f "tokens=1-4 delims=." %%a in ("%e%") do set "e1=%%a" & set "e2=%%b" & set "e3=%%c" & set "e4=%%d"

if %s1% GTR %e1% echo 您输入的起始Ip比结束Ip大,这显然是错误的... & goto :eof
for /l %%a in (!s1!,1,%e1%) do (
if !s1! LSS %e1% (set "nn1=255") else (set "nn1=%e2%")
for /l %%b in (!s2!,1,!nn1!) do (
if !s2! LSS !nn1! set "nn2=255" || if !s2! EQU !nn1! set "nn2=%e3%"
for /l %%c in (!s3!,1,!nn2!) do (
if !s3! LSS !nn2! set "nn3=254" || if !s3! EQU !nn2! set "nn3=%e4%"
for /l %%d in (!s4!,1,!nn3!) do echo %%a.%%b.%%c.%%d >>1.txt

set /a s3+=1
set "s4=1"
)
set /a s2+=1
set "s3=1"
)
set /a s1+=1
set "a2=1"
)

:eof
pause

汗!~~我自己看着那些个循环就直想晕。对不起他(指这段程序)啊,写到现在这个地步的时候已经是今日凌晨1点多了,头很晕,还有点痛,这种程序还真是要了我的亲命,因为还要上班所以就关机,洗洗睡了。

决定暂时不写了便感觉轻松了。有句话怎么说的来着:当你想要找到他的时候是弄死弄活找不到,当你不想找他的时候吧他又自己冒出来了。嘿嘿,既然你冒出来了,那是万万不能让你跑了的%——*¥#·!……

扯远了,当时我在刷牙,突然脑袋时闪出了前段时间看的一篇贴子,贴子内容大概就是说访问一个网部除了可用URL和IP地址外还有一种方法,即可把Ip地址转换成一个8进制的数字串。如网易便分别可用三种方式访问:
http://www.163.com
http://202.108.9.29
http://312254011035
我试过,不行便也不去管它了,但是这个想法却是对我大大的有用啊,我何不将Ip地址当成一个4位的256位数字呢,使用FOR循环一个就搞定,然后再将它转换回去……
想到这我是手舞足蹈,嘴里还冒着白沫,右手拿着把蓝色的牙刷,两于上举,屁股扭啊扭的,还吓坏了一个起夜的哥们……
下面是用 10多分钟写好并调试完成的代码:
::code dy Flws(QQ:409947470)
::made date:2008年7月30日 21时2分

title 输入起始Ip和结束Ip得出中间的Ip
@echo off
cls
SETLOCAL ENABLEDELAYEDEXPANSION
if exist %tmp%/IpList.txt del /f /q %tmp%/IpList.txt
SET /P StartIp=请输入起始Ip:
echo. & SET /p EndIp=请输入结束Ip:
echo. & echo 正在计算中的Ip并保存到%tmp%/IpList.txt,请稍等(如果您输入的Ip段较大可能需要一点时间,请耐心等待)...

for /f "tokens=1-4 delims=." %%a in ("%StartIp%") do set /a "StartNum=%%a*256*256*256+%%b*256*256+%%c*256+%%d"
for /f "tokens=1-4 delims=." %%a in ("%EndIp%") do set /a "EndNum=%%a*256*256*256+%%b*256*256+%%c*256+%%d"

for /l %%a in (%StartNum%,1,%EndNum%) do (
set /a "s4=%%a %% 256"
if not "!s4!"=="0" (
if not "!s4!"=="255" (
set /a "num=%%a / 256" & set /a "s3=!num! %% 256"
set /a "num=!num! / 256" & set /a "s2=!num! %% 256"
set /a "num=!num! / 256" & set /a "s1=!num! %% 256"

echo !s1!.!s2!.!s3!.!s4! >>%tmp%/IpList.txt
)))

start "" "%tmp%/IpList.txt"
echo 导出完成...
pause

结束语:爱好之所以是爱好也是因为有的时候搞不出来便可以暂时不搞,待得哪日状态好了再来收拾它。而工作不同,你大多数的时候是做并恨着……
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值