起因,妹子问的实习的公司连不上网,只有公司电脑连有线才可以,但是她在输ip地址从192.168.101.100192.168.101.254一个个试(已经试到206),还是连不上网怎么办?

其实我对这个连不上网的问题真的好菜啊...,仅有的一次还是利用192.168.1.1(还是什么去了..)登录上路由器,然后路由器密码还是贼简单,登上去了,就改了一个路由器的名字,开心了半天,然后就没有然后了...

回到正题,于是赶快google,知乎搜,还是不知道怎么做,就知道了一个DHCP静态ip的名词.. 以及看到网友推荐了一本书,网络是怎样连接的,mark一下了

接着只好很丢脸的说,我不会啊,但是妹子说的从192.168.101.100192.168.101.254一个个试,却留下了印象,就是,我们会用ping来测试网络是不是畅通,那么有没有一种方法能让自动的ping呢?

也就是今天自己学会的bat脚本:

刚开始搜到这个:shell脚本实现网络连接的检测,这里面的思路就用循环从0到254,依次ping,很好,不过这是shell脚本,也就是在我的电脑上装了git-bash是可以运行的,但是妹子的电脑是没有的,也就是要转化成bat脚本啊,于是坑就来了

bat脚本的格式语法问题:

@echo off ::开头,不显示后续命令行及当前命令行

set var_name = "hello" ::set来定义变量

echo %var_name%   ::echo用于输出,变量取值用%var%

for /l %%i in (1,1,254)  ::递增循环的示例 /l表示带开关,此处的变量是%%i
do (
    :: code here     
)

于是代码初步这样:

@echo off
::Ping网段所有IP
set ip="192.168.0."  
for /l %%i in (1,1,254)
do (
ping -c 2 %ip%%%i |grep -q 'ttl=' && echo "%ip%%%i yes"|| echo "%ip%%%i no"
)
::yes正常,no主机不存在或不正常   
pause

遇到的麻烦:

一闪而过...,应该是语法错误了,直接在cmd中输入ping,根本没有-c的参数,而且grepSearch for PATTERN in each FILE or standard input,都去掉,依然一闪而过...

后来改成for /l %%i in (1,1,254) do ( ping %ip%%%i && echo "%ip%%%i yes"|| echo "%ip%%%i no" ),写成一行可以,但报

错误的参数 1。
""192.168.0." 1 no"

在循环中拼接字符串,ping %ip%%%i 难道不可行?

批处理文件在循环中拼接字符串,为什么结果不对啊问题中发现也有人遇到过,是需要设置环境变量延迟,加上setlocal enabledelayedexpansion,并变成ping !ip!%%i,可还是报同样的错误

难道是%%i是数字类型,而ip是字符串类型根本不行?

在bat批处理脚本中,怎样将for语句中的%%i当作字符串处理?做类似于%str:~1,5%之类的操作?

可以用在循环中在设一个变量等于%%i的方法,即set num= %%i ping !ip!!num!,结果没了错误参数,变成

""192.168.0." 1 yes"

这到底好没好呢...

同时又有提到字符串拼接的批处理用的是set /a num+=1set str=!str! %%i ,再在cmd批处理中set /a和set /p的区别介绍,了解到

/P 命令行开关允许将变量数值设成用户输入的一行输入

/a 是指定一个变量等于一串运算字符

彩蛋是这里面的实例2竟然有ping的示例代码

@echo off
set a=1
:start
echo %a%
ping 172.19.5.%a% -w 1 -n 1|find /i "Lost = 1"&&set c=1||set c=0
if %c%==0 (echo 172.19.5.%a% >>IP.txt)
set /a a=%a%+1
if %a%==255 exit
goto :start

利用goto变成一个do...while的结构,而且巧妙的用172.19.5.%a%避免了之前的字符串拼接,最后还能把ping成功的ip写入txt

自己粘过来试,仍不成功...因为明明在我的电脑上172.19.5.x都是ping不通的,却也全部写入了txt文件

再次查看ping命令:发现-w为等待每次回复的超时时间(毫秒),这里设置为1,-n为要发送的回显请求数,而find,作者是想找到Lost=1的ping不通的,但是我的是中文...,设为丢失=1就好了:

1
数据包:已发送 = 1,已接受 = 0, 丢失 = 1 (100%丢失)

完美!

还有一种方式,之前看到设置超时为1,觉得是超时太断所致,即使是ping通的也会被判断为错误的,就直接改成,去掉find,并需要把判断条件改成%c%==1

ping 192.168.101.%a% -n 1 && set c=1 || set c=0
if %c%==1 (echo 192.168.101.%a% >>IP.txt)

这样也是可行的,但是每次都会输出一大堆的ping的回显消息了

其实过程中还有,各种报ECHO处于关闭状态的错误等,从下午到晚上,也算是第一次知道了shell编程是什么,以及借此好像阴差阳错的懂了一点点linux的强大

最后希望自己慢慢的不要那么菜吧哈哈

还有部分的参考连接:

.bat批处理(三):变量声明、设置、拼接、截取

BAT批处理为何报错echo处于关闭状态?

易百教程-批处理简介

标签: none

添加新评论