几日前一同事问我扫描一个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
结束语:爱好之所以是爱好也是因为有的时候搞不出来便可以暂时不搞,待得哪日状态好了再来收拾它。而工作不同,你大多数的时候是做并恨着……
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
结束语:爱好之所以是爱好也是因为有的时候搞不出来便可以暂时不搞,待得哪日状态好了再来收拾它。而工作不同,你大多数的时候是做并恨着……