Dos下批处理命令bat

tips: 一键操作的批处理命令,重复的事情交给电脑~~

前言

在我们开发过程中,经常会遇到切换环境,重启nginx,或者执行一系列的dos命令等,频繁的操作势必会很繁琐,浪费时间,作为一个程序员,重复的事情,当然要交给电脑了~

首先了解一下什么是 .bat ?

批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展名为bat;

正文开始

以一个简单的nginx启动、重启、停止说起:

1. 首先切换到nginx目录,包含nginx.exe目录;
2. 按住shift,鼠标右键在此处打开powershell窗口;  

nginx一般的三个操作如下:

描述 命令
启动 start .\nginx.exe
重启 .\nginx.exe -s reload
停止 .\nginx.exe -s stop

注意:如果你不小心启动了多次,那么就会启动多个nginx进程,你用stop不能全部停止;可以用如下命令:
taskkill /fi "imagename eq nginx.EXE" /f 杀掉所有的nginx进程;

接下来就展示如何使用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
28
29
30
31
32
33
34
35
36
37
38
@echo off
:entry
cls
echo nginx一键操作命令集合:
echo ********************************
echo 1. 开启nginx
echo 2. 重启nginx
echo 3. 停止nginx
echo 4. 退出
echo ********************************
echo 请选择你要执行的操作...
set /p userchoice=
if "%userchoice%"=="1" goto startN
if "%userchoice%"=="2" goto reloadN
if "%userchoice%"=="3" goto stopN
if "%userchoice%"=="4" goto quit

:startN
start .\nginx.exe
goto succ

:reloadN
.\nginx.exe -s reload
goto succ

:stopN
taskkill /fi "imagename eq nginx.EXE" /f
goto succ

:quit
exit

:succ
echo 执行成功
pause
goto entry

@echo on

首先在上面说到的nginx目录下,新建一个.bat文件
,将上述代码放进去就可以体会到一键操作了;

接下来大概说说代码set /p userchoice=,意思是设置一个变量userchoice,值为用户输入;:startN :entry :succ类似一个方法,判断用输入的值,执行对应的方法;批处理命令是一行一行的执行命令,执行完成后,就会关闭shell窗口,如果想保持可以使用 pause 会出现请按任意键继续…;如此就完成了一个一键操作的脚本,由于该文件放在nginx的安装目录,为了方便,可以右键,发送快捷模式到桌面;

bat进阶-修改文件

由于目前本地的项目是用nginx启动访问,至于为什么,这里不解释,就是必须要用nginxnginx里面的转发需要调用后台接口,而调用的环境经常变化,这样就需要先修改代理接口环境地址,然后重启nginx

现在我们的bat要执行修改文件,然后重启nginx操作,代码如下(仅供参考)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@echo off
:entry
cls
echo *****系统一键切换环境*****
echo ********************************
echo 1. 开发dev01环境
echo 2. 开发dev02环境

echo 3. ---测试--01--环境
echo 4. ---测试--02--环境
echo ********************************
echo 请选择你要切换环境...
set /p userInput=

if "%userInput%"=="1" goto dev01
if "%userInput%"=="2" goto dev02
if "%userInput%"=="3" goto test01
if "%userInput%"=="4" goto test02

:dev01
set cc=proxy_pass http://ys.dev01.51ju.cn; #tag
goto switch

:dev02
set cc=proxy_pass http://ys.dev02.51ju.cn; #tag
goto switch

:test01
set cc=proxy_pass http://ys.test.51ju.cn; #tag
goto switch

:test02
set cc=proxy_pass http://ys.test02.51ju.cn; #tag
goto switch

:switch
echo 正在切换中...
echo -------------------------
(for /f "tokens=*" %%i in (a.conf) do echo %%i|findstr /ie tag>nul&&echo %cc%||echo %%i)>temp.ini
move /y temp.ini a.conf
echo -------------------------
echo 已经切换至: %cc%
echo -------------------------
echo 开始重启nginx...
cd ../../
.\nginx.exe -s reload
echo --------------------------
echo nginx 重启成功~
cd D:\nginx-1.13.12\conf\servers\
echo --------------------------
pause

goto entry
@echo on

大概原理同上,主要说明一下for循环这个语句,

  • 首先获取到a.conf,然后循环每一行代码,
  • %%i相当于循环的当前行代码,
  • |findstr是在当前行查找字符串,
  • /ie忽略大小写和从行末开始查找;
  • tag>nul找到'tag'时,就把这一行清空:
  • echo %cc%是将方法中设置的cc值复制到这一行;
  • move -y就是移动文件到当前目录并取消重写文件发出的提示;

注意: 默认配置中,需要修改的那一行命令需要添加一个标记tag。

以上就完成了对一个文件的修改;修改文件后,需要重启nginx,但是这个文件的目录和nginx不在同一个目录下,需要执行命令cd ../../跳转到nginx.exe的那个目录,执行nginx重启,由于切换命令要重复使用,当前目录已经修改了,所以需要再跳转回来cd D:\nginx-1.13.12\conf\servers\;

娱乐一下

相信看过科幻片的同学都知道,电脑大神或者黑客操作电脑时,不断的弹出dos窗口,然后绿色代码滚屏,其实很简单实现,原理如下:

1
2
3
4
5
6
7
8
9
@echo off
echo 当前在call目录下

start "reload" cmd /k
cd /d D:\test
call reload.bat

echo over...
pause

以上是在当前脚本中,新开dos窗口并调用其他目录下的脚本,如此循环重复,很简单的就实现不断开dos窗口了,至于滚屏,结合echo输出就可实现,pause命令是,代码执行到这一行时,提示请按任意键继续… 然后继续执行命令;

ps: 第一次捣鼓bat,如有错误,欢迎指出,共同进步;


参考链接: