第一次bat脚本踩坑记
起因,妹子问的实习的公司连不上网,只有公司电脑连有线才可以,但是她在输ip地址从192.168.101.100到192.168.101.254一个个试(已经试到206),还是连不上网怎么办?
其实我对这个连不上网的问题真的好菜啊...,仅有的一次还是利用192.168.1.1(还是什么去了..)登录上路由器,然后路由器密码还是贼简单,登上去了,就改了一个路由器的名字,开心了半天,然后就没有然后了...
回到正题,于是赶快google,知乎搜,还是不知道怎么做,就知道了一个DHCP和静态ip的名词.. 以及看到网友推荐了一本书,网络是怎样连接的,mark一下了
接着只好很丢脸的说,我不会啊,但是妹子说的从192.168.101.100到192.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的参数,而且grep是Search 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+=1,set 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的强大
最后希望自己慢慢的不要那么菜吧哈哈
还有部分的参考连接: