响应式网站内容布局/百度公司地址在哪里
bat编写检测目标主机状态执行操作(局域网)
出于某种非常规的运维需求原因,需要一款程序完成这个功能,写的特别烂,自己看了都烂,各位轻喷;
一直在学JAVA,学的过程中发现要实现这个程序的功能,得至少学到IO流呢;看了下课程还有几百章才到(课程时长短却信息量很大);顿时放弃需求开发,老老实实跟着课程走,至少入个门嘛,结果无意中发现DOS能写,于是花了一天的时间各种测试,查资料,自编;
好吧,大部分时间都在想程序运行逻辑,不同语言部分运行逻辑不一样,哈哈哈哈哈。感谢论坛某位哥们分享的《批处理标准教程》.pdf。帮老大忙了;
文章目录
- bat编写检测目标主机状态执行操作(局域网)
- 程序功能
- 使用工具
- 代码
- 说明
- 待开发功能
- 没有理解的逻辑
- 问题点
- 个人感想
程序功能
-
根据目标主机的状态,进行对另单个/多个主机群进行开机与关机的操作;
-
定义目标主机上线的多少时长进行操作,定义目标主机下线多少时长进行操作;
-
通过唤醒指令,进行主机远程唤醒开机(局域网类)
-
ping方式检测主机与arp-a方式检测主机(目前是ping方式)
-
核心代码
ping -n 1 192.168.1.5>>1.txt type 1.txt|find "TTL"&&执行语句
-
实际上是通过,不断发送请求,然后累计变量计算,最终达到自定义操作效果;
-
嗯…还是感觉很烂,确实自己太多技术栈不了解了,也不会用,不过花了整整一天时间,从没用过dos写过东西,自学查资料;也能把这个需求功能做出来,多少能找点自信心,各位轻喷哈哈哈哈哈;
使用工具
- dos(批处理脚本)
- WakeMeOnLan(局域网唤醒工具)
- Bat To Exe Converter(打包软件)
- win10自带任务计划程序
- 电脑两台(得测试嘛不是,后来才想到内装一台虚拟机也能测试)
代码
@echo off
::可以使用ping IP方式,也可以使用arp-a mac地址方式;:var
set a=0
set b=0
set c=0
set d=0
set time=1800
set /a time=time/3
del 1.txt:top1
set /a b1=b/20/50
set /a a1=a*3/60
if %a% equ %time% WakeMeOnLan.exe /wakeupmulti 192.168.1.33(增加开机IP地址或者MAC地址)&set a=0&set /a d+=1
if %b% equ 10 shutdown -s -t 1 -m 192.168.1.22&shutdown -s -t 1 -m 192.168.1.21&(增加关机IP地址)&set /a c+=1
title 检测主机状态,执行开关机操作,已在线%b1%分,已离线%a1%分;已执行关机次数%c%次;已执行开机次数%d%次;:top2
del 1.txt&&ping -n 1 192.168.1.5>>1.txt
type 1.txt|find "TTL"&&set a=0&&set /a b+=1&&echo 已在线%b%秒
type 1.txt|find "TTL" ||set /a a+=1&&set b=0&&echo 已离线%a%秒&goto top1pause
说明
-
:var层
- a为离线时间计数;
- b为开机时间计数;
- c为关机次数执行状态:1为已执行,0为未执行;
- d为开机次数执行状态:1为已执行,0为未执行;
- time赋值时间(秒);(目标主机离线多久,执行操作。这里输入的1800秒也就是30分钟)
- time/3:这里除3是因为ping的错误返回值是3秒一次,不是1秒,所以变量a是三秒自加1;导致time参数以秒为单位先除3.好接近准确时间(这里有误差的哟,我这里是不在乎这点误差而已)
-
:top1层
- 变量b1和a1的运算都是为title进行的秒到分的计算(不是准确的哈,有误差);
- 2个if就没什么说的了,最终控制层写到这里面;
- title:这里面的数字有问题,已在线时长是准确的,已离线时长会根据变量%time%的时长进行重置(算一个bug吧),已关机次数是准确的,已开机次数是会累加的,也是根据变量%time%的时长再次开机操作(我默认这样设置的,因为有的时候一条指令没开机,那就循环再开一次,反正也没影响;主要是我没在下面继续写完判断分支,还是我的错(哭))
-
:top2层
- 核心判断层了,主要是用到了>>写进一个txt文件;再读取这个文件用find "TTL"进行判断是否在线或者离线;
- 重点在于&&这个符号是判断,符号前代码正常运行则继续往后走;如果则不再执行后面语句;
- ||这个符号是判断,符号前代码错误运行,则继续往后执行能正常执行的代码;
- 这里后面写了太多的符号操作了,可读性极差,我的错(哭)
-
外层操作
-
用程序把bat打包成exe文件,为了让另一个bat文件对他进行关闭操作。没找到bat执行关闭bat的命令;
-
代码:通过win10自带任务计划程序定时运行这个bat文件;做到定时任务(懒狗,主要是我不知道怎么在一个程序里写完定时关闭本命令,哈哈哈;)
@echo off taskkill /f /t /im 123.exe pause
-
待开发功能
哎呦喂,这个可就多了呢,我列出来的目的有两个,有刚需了就写或者有空闲着就写;
- 列的那些BUG该修复还是得修复;
- 程序自己定时开启功能,和定时关闭功能;
- 图形化界面或者读取config文件
- 一些完成状态进行信息通知,优先级(微信>QQ>邮箱);当然是想写体验最好了的啦;
- 一些执行操作,能够通过操作端发送请求给程序,不局限于(微信>QQ>邮箱);同上;
- 能够检测哪些机子是需要关机的,哪些机子不需要(这个属于自己特殊需求)
- 能够写成函数执行最好;可读性会提高;
- 略…
没有理解的逻辑
- 是不是因为批处理脚本问题,命名变量赋值的时候,赋值也会执行?导致控制层代码内可读性/维护性极差;
- 为啥ping不通的错误返回间隔是3秒左右?没有在其他机子上测试,这也导致了有些补漏的代码在里面;
- 为啥ping的时候,不能执行其他操作,是不是他是单线程工作,嗯,很大可能是的;
暂时想到这些,有些想不通的都忘记了;
问题点
- 【重要】同一个局域网内,针对手机进行Ping和arp-a操作,当苹果手机不关机只是息屏的时候,ip地址和arp-a查找的网络注册表,这个手机IP都会消失!但是手机还是联网的,额只测试了苹果,没有测试安卓;有谁知道的话,感谢解答下,或者有额外的方法,在下感激不尽!!
- 有没有其他能够判断ping的方法,我用的是读取,所以一些延迟时间的问题是因为这个导致的,能够ping的同时不断进行判断的方法;
- 为啥批处理文件总写不了封装函数,有些很莫名其妙的问题,我也说不出来在哪,是在用java不会出现的;我知道当然是我学艺不精哎;
个人感想
算自我成长第一步吧,以前都不算是用轮子了,都是在论坛直接用大卡车搬轮子用,现在能根据自己的需求写一点,对自己意义挺大;还有挺长路要走,共勉;
代码直接放出来,复制保存,后缀改成.bat就行;所用的工具都可以网上搜索,我就不上传了;