批处理查看同一子网络下的所有IP在线情况
本文的批处理可以让您知道自己所在局域网的同一网段下都有哪些IP被使用了。不得不承认,我在创造这个批处理的时候想法很奇怪,甚至有些愚蠢。
:::::::查看所有子网IP.bat::::::: @echooff title查看所有子网IP set/aOnline=0 set/aOffline=0 set/aTotal=256 setExportFile=子网IP在线统计.txt ::初始化在线IP与不在线IP的个数为零,共扫描256个IP,结果输出的文件名 setStartTime=%time% ::记录程序的开始时间 for/f"delims=:tokens=2"%%iin('ipconfig/all^|find/i"IPAddress"')dosetIP=%%i ::获得本机IP[注1] if"%IP%"==""echo未连接到网络&pause&goto:EOF if"%IP%"=="0.0.0.0"echo未连接到网络&pause&goto:EOF ::当IP为空或0.0.0.0时,提示未连接并退出该程序 for/f"delims=.tokens=1,2,3,4"%%iin("%IP%")do( set/aIP1=%%i set/aIP2=%%j set/aIP3=%%k set/aIP4=%%l ) ::以句点为分隔符,分别将IP的四个十进制数赋给四个变量 set/aIP4=0 echo在线的IP:>%ExportFile% ::初始化IP的第四个数值为零,并创建结果输出文件 :RETRY ping%IP1%.%IP2%.%IP3%.%IP4%-n1-w200-l16>nul&&set/aOnline+=1&&echo%IP1%.%IP2%.%IP3%.%IP4%>>%ExportFile%||set/aOffline+=1 ::ping目标IP[注2] set/p=[将本文底部评论4中的退格符替换到此处]set/aScanned=%Online%+%Offline% set/aProgress=(%Online%+%Offline%)*100/%Total% set/p=正在扫描:%Scanned%/%Total%扫描进度:%Progress%%%::删除当前行的内容,并重新显示进度信息[注3] set/aIP4+=1 if%IP4%lss%Total%goto:RETRY ::当IP的第四个数值小于总数时,跳转回:RETRY处,重复执行直到全部ping完为止 echo. echo. setEndTime=%time% ::记录程序的结束时间 set/aSeconds=%EndTime:~6,2%-%StartTime:~6,2% set/aMinutes=%EndTime:~3,2%-%StartTime:~3,2% if%Seconds%lss0set/aSeconds+=60&set/aMinutes-=1 if%Minutes%lss0set/aMinutes+=60 ::计算时间差 set/aPercent=%Online%*100/(%Online%+%Offline%) ::计算在线百分比 echo在线IP个数:%Online% echo不在线IP个数:%Offline% echo在线百分比:%Percent%%% echo统计耗时:%Minutes%分%Seconds%秒 echo统计日期:%date%%time:~0,-3% echo.>>%ExportFile% echo在线IP个数:%Online%>>%ExportFile% echo不在线IP个数:%Offline%>>%ExportFile% echo在线百分比:%Percent%%%>>%ExportFile% echo统计耗时:%Minutes%分%Seconds%秒>>%ExportFile% echo统计日期:%date%%time:~0,-3%>>%ExportFile% echo记录已保存到文件"%ExportFile%"中 ::显示结果并将结果保存到文件中 pause ::::::::::::::::::::::::::::::::
注1.ipconfig是内置于Windows的TCP/IP应用程序,用于显示本地计算机网络适配器的物理地址和IP地址等配制信息,这些信息一般用来检验手动配置的TCP/IP设置是否正确。当在网络中使用DHCP服务时,ipconfig可以检测到计算机中分配到了什么IP地址,是否配置正确,并且可以释放,重新获取IP地址。这些信息对于网络测试和故障排除都有重要的作用。[3]
更详细的说明请参阅ipconfig/?。ipconfig/all,参数/all表示查看详细的网络配置。命令ipconfig/all^|find/i"IPAddress"表示在'ipconfig/all的结果中,以"IPAddress"为查找对象,进行搜索(其结果类似于:IPAddress............:10.30.11.51)。
而整条命令中的for语句,则表示在上述结果中,以冒号为间隔(delims=:),查找第2个字串(tokens=2)。很明显,所找到的结果就是自己电脑当前的IP地址了(如果您只有一快网卡或是只启用了一个网卡的话。显然,对于多个网卡会显示出多个IP的情况,我并没有考虑的太全面)。[关于for更详细请参阅4.2.4小节]
另外,注意到在ipconfig/all^|find/i"IPAddress"中有一个转义字符^,它的作用是让后面的管道命令|生效,而不是让程序把|误解为for语句里参数的一部分。
注2.ping其实才是本批处理的核心部分。命令ping的主要作用是通过发送数据包并接收应答信息来检测两台计算机之间的网络是否连通。比如我可以输入ping10.30.11.35以便查看我是否能与我所在的局域网中IP为10.30.11.35的机器连通。如果我不懂批处理的话,也许我就得从IP10.30.11.1开始,挨个地ping到IP10.30.11.255,才能达到我在本小节的最初目的。
在批处理中ping的3个参数-n1-w200-l16分别表示:仅ping一遍[-n1],等待200毫秒后按超时考虑[-w200],发送16字节的数据[-l16]。
另外,此命令行中同时用到了两个&&和一个||的组合命令,我不得不承认这种复杂的逻辑关系会给您带来阅读上的困难。
注3.这里使用了set/p=显示内容
本文的使用程度并不大,却很有趣,至少并没有想象中的那么愚蠢。