win:自定义cmd脚本及任务计划检查断网并自动重启

工作中有这样一个场景,需要一台Windows电脑24小时地运行一个程序。

因公司要求,电脑不能连Wi-Fi,只能连交换机出来的网线。但是我们办公室的交换机比较老旧,电脑网络经常断连,导致程序无法正常运行。问题解决起来也简单,重置一下电脑网络就能恢复。但是多次断网出现在晚上,运维很不方便。因此,还是需要一个自动检测断网并重置网络的程序来处理。

百度了一圈,最后采用了cmd脚本+任务计划的方式来实现。

自动重启脚本

脚本大致要实现以下功能:

  1. 检测当前是否断网;
  2. 断网时重置网络;不断网时不做任何处理。

检测是否断网

1
2
3
4
5
6
7
8
9
:begin
# ping百度
ping www.baidu.com > nul
# 获取ping的结果
rem echo %errorlevel%
# ping失败则跳转到重启部分
if %errorlevel% == 1 goto reboot
# ping成功则跳转到暂停缓冲区
goto loop

通过ping百度来判断是否断网;然后echo返回ping结果。

%errorlevel% == 1则跳转到reboot;否则跳转到loop

重置网络

1
2
3
4
5
6
7
8
9
10
:reboot
echo %date% %time% 网卡停止中...
# 禁用网卡
netsh interface set interface "以太网" disabled
echo %date% %time% 网卡启动...
# 启用网卡
netsh interface set interface "以太网" enabled
echo %date% %time% 网卡已重新启动
# 输出日志
echo %date% %time% 网卡已重新启动 >> errorlog.txt

通过netsh命令,设置对应网卡名称(比如我的电脑上叫以太网)的网卡,先禁用,再启用,然后保留一份重启时间(也可以不保留)。

可以在cmd先测试一下netsh interface set interface "以太网" disablednetsh interface set interface "以太网" enabled两条命令。

⚠️需要cmd右键以管理员方式运行

如果运行失败,可能是你电脑上的网卡名称不为以太网,可以通过下面这个命令获取网卡名称:

1
netsh interface show interface

暂停缓冲

因为实际上允许一定时间的断网,不需要一直ping,所以一次ping成功后,可以暂停一定时间再进行下次ping。

1
2
3
4
:loop
# ping本地30秒
ping 127.0.0.1 -n 30 > nul
goto begin

通过ping本地ip30秒来实现暂停操作,30秒后重新进入begin

创建脚本

将上面的命令整合之后得到如下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@echo off
if not "%OS%"=="Windows_NT" exit
title 网络自动检测重启服务
echo 网络自动检测重启服务正在运行中...
echo 按 Ctrl + C 停止服务

:begin
ping www.baidu.com > nul
rem echo %errorlevel%
if %errorlevel% == 1 goto reboot
goto loop

:reboot
echo %date% %time% 网卡停止中...
netsh interface set interface "以太网" disabled
echo %date% %time% 网卡启动...
netsh interface set interface "以太网" enabled
echo %date% %time% 网卡已重新启动
echo %date% %time% 网卡已重新启动 >> errorlog.txt

:loop
ping 127.0.0.1 -n 30 > nul
goto begin

使用win记事本新建txt文件,将上面的内容黏贴进去,然后另存为,将编码改为ANSI。

image-20210706145204159

重命名为net-restart.bat。系统可能会跳出如下提示:

image-20210706144907327

点击即可。

这时,你就得到了一个可以运行的批处理文件。右键文件,以管理员方式运行。

image-20210706145431520

如果服务重启,会将信息打印出来,同时将重启日志追加记录到errorlog.txt内。

目录重定位

errorlog.txt的默认地址是和bat文件同一个地址,但是以管理员方式运行后,默认路径被更改到了,errorlog.txt也被输出在了那里。若要重新改为bat文件的地址,可使用:

1
cd /D %~dp0

此命令将目录cd到当前目录下。可以通过邮件bat文件,点击编辑进行更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@echo off
if not "%OS%"=="Windows_NT" exit
title 网络自动检测重启服务
echo 网络自动检测重启服务正在运行中...
echo 当前目录:%cd%
echo 变量扩充: %~dp0
cd /D %~dp0
echo 更改后的目录:%cd%
echo 按 Ctrl + C 停止服务

:begin
ping www.baidu.com > nul
rem echo %errorlevel%
if %errorlevel% == 1 goto reboot
goto loop

:reboot
echo %date% %time% 网卡停止中...
netsh interface set interface "以太网" disabled
echo %date% %time% 网卡启动...
netsh interface set interface "以太网" enabled
echo %date% %time% 网卡已重新启动
echo %date% %time% 网卡已重新启动 >> errorlog.txt

:loop
ping 127.0.0.1 -n 30 > nul
goto begin

定时任务

定时任务使用了win自带的任务计划程序

在搜索程序中搜索该程序:

image-20210706152419582

打开,在菜单栏选择操作-创建任务。

  1. 自定义任务的名字,并设置为管理员权限

image-20210706153118651

  1. 设置触发条件为开机启动。

    image-20210706153447049

  2. 设置操作为启动刚刚编辑的bat文件,在浏览里选中bat文件的路径。

    image-20210706153611611

  3. 关闭长时间执行自动停止

    image-20210706154232075

  4. 点击确认后,会要求你输入登录密码(因为前面请求了管理员权限)。

    完成后可在任务计划程序库里找到刚刚新建的任务,点击任务右键运行即可。程序会在每次开机时自动启用,并且避免了总是要打开终端窗口。


土豪将鼓励我继续创作和搬运!