第一次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
的强大
最后希望自己慢慢的不要那么菜吧哈哈
还有部分的参考连接: