一个导致我要学习bat批处理的原因是因为我所在的公司要让我部署一个jar包到一台windows服务器上,但是我们都知道,如果使用过命令行CMD启动,那么必然会有一个黑黑的命令行的框框在那里,也不是说它丑,但的确也算不上美观。因为这个服务器是跟别人共用的,那么必然会出现一个问题,要是别人登上这个服务器后误关了,那不就芭比Q了吗,所以我第一个想到的是让jar包后台运行,但是后来想了想,既然都可以后台运行了,那么要不然我再写个脚本?这样每次就只需要双击就可以实现启动、关闭、重启了,于是我有了以下的脚本内容:
- start.bat
@echo off
setlocal EnableDelayedExpansion
set pid=0
set port=8080
for /f "tokens=5" %%a in ('netstat -aon ^| findstr %port%') do (
set pid=%%a
)
if "%pid%"=="0" (
echo try start the programing with the test environment
start javaw -jar -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms512m -Xmx512m -Xmn256m -Xss256k -XX:SurvivorRatio=8 xxx.jar
echo the programing is started
) else (
echo the programing is already running or the port !port! is not free, please check and try again...
pause
exit
)
pause
- stop.bat
@echo off
setlocal EnableDelayedExpansion
set pid=0
set port=8080
for /f "tokens=5" %%a in ('netstat -aon ^| findstr %port%') do (
set pid=%%a
)
if "%pid%"=="0" (
echo port !port! is not running
) else (
echo pid = [!pid!]
taskkill /f /pid !pid!
echo the programing which in running on port !port! has been killed
)
pause
- restart.bat
@echo off
setlocal EnableDelayedExpansion
set pid=0
set port=8080
for /f "tokens=5" %%a in ('netstat -aon ^| findstr %port%') do (
set pid=%%a
)
if "%pid%"=="0" (
echo port !port! is not running
) else (
echo pid = [!pid!]
echo stoping the programing. please wait...
taskkill /f /pid !pid!
echo the programing which in running on port !port! has been killed
)
echo try start the programing with the test environment
start javaw -jar -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms512m -Xmx512m -Xmn256m -Xss256k -XX:SurvivorRatio=8 xxx.jar
echo the programing is started
pause
但是说实话,我写上边的内容的时候,都是边查资料边参考前人写的内容写出来的,好在,可以正常工作。有人可能会问,为啥不弄成自启服务?emmmmm,一个重要的原因,运维说最好不要乱下一些软件到服务器上,所以只能采用这个比较笨的方法了,虽然无法自启,但是启动起来也还好,勉勉强强能用。
搞这个东西的过程中,感觉有点意思,以前也有简单接触过,但是基本都忘记了,所以我决定大概学它个七七八八。
好了,前言介绍完了,接下来都是笔记,可能比较乏味,将就看哈~
学习之前,先了解一个指令pause
,见词思意,是暂停的意思,即我们经常会看到命令行中出现请按任意键继续...
,就是这个指令的效果。
1. 显示信息:echo
这个其实没啥太多好说的,就是一个输出,很类似于各种编程语言里边的打印
- 打开cmd,然后输入:
C:\Users\necde>echo hello,world
hello,world
因为我们是说的bat批处理,所以还是要准备一个.bat文件的,在随便一个地方(比如 D:\personal\bat_workspace\)创建一个以.bat为后缀的文件,如mybat.bat
- 键入以下信息
echo hello,world
echo my name is neco
pause
执行的结果如下
D:\personal\bat_workspace>echo hello,world
hello,world
D:\personal\bat_workspace>echo my name is neco
my name is neco
D:\personal\bat_workspace>pause
请按任意键继续. . .
- 如果要取消输入指令的输出,即取消类似
D:\personal\bat_workspace>****
的显示,只需要在具体指令之前加入@
,修改后的内容如下:
@echo hello,world
@echo my name is neco
@pause
执行结果如下:
hello,world
my name is neco
请按任意键继续. . .
- 也可以在bat脚本前面使用@echo off关闭输入指令的输出
@echo off
echo hello,world
echo my name is neco
pause
该方法与上边 2 的执行效果一致
- 如果要输出空行,即相当于只有一个回车,则可以使用
echo.
这里.
要紧跟在echo后,当然.
也可以使用,:;"/]+\
中的任意一个替代,如果真的好奇,可以自行尝试
5.echo
和管道命令|
的结合使用
格式:echo 回复|其他的指令 (如果回复是指输入enter回车,则大概的示例如下 echo.|其他的指令)
- 例子1:输出当前时间后输入一个回车
D:\personal\bat_workspace>echo.|time
当前时间: 14:41:59.26
输入新时间:
D:\personal\bat_workspace>
- 例子2:删除指定目录后输入y
D:\personal\bat_workspace>echo y|rd /s test
test, 是否确认(Y/N)? y
D:\personal\bat_workspace>
- 可以使用echo将内容写入到指定文件中,如果文件不存在则会创建文件
- 输出内容到指定文件
D:\personal\bat_workspace>echo hello,world>hello.txt
查看文件
也有人说可以用echo来创建文件,如使用
echo.>tmp.txt
但这其实也是将换行写入了tmp.txt
中,本质还是将内容写入到指定文件,另外,这里的写入是覆盖形式的,即执行指令后目标文件原本的内容会被覆盖。
2. 注释语句:rem
rem为注释命令,即类似编程中的注释符号,rem后面的内容不会被执行。另外也常用::
当注释用,程序通用会忽略::
后的内容,但如果是:字母开头的字符串
,程序可以将其识别为标号(结合goto
使用),具体的例子如下:
- 例子:
@echo off
echo this is an example for rem and ::
rem this is a comment line
:: this is also a comment line
pause
- 执行结果:
this is an example for rem and ::
请按任意键继续. . .
3. 目录切换:cd
这个是比较常用的命令了,直接上例子吧
- 返回上一层
D:\personal\bat_workspace>cd ..
D:\personal>
- 进入指定目录
D:\personal>cd bat_workspace
D:\personal\bat_workspace>
- 返回根目录
D:\personal\bat_workspace>cd \
D:\>
- 切换盘符,这个比较特殊,可以给出几种切换失败的例子
D:\>cd C:
C:\
D:\>cd C
系统找不到指定的路径。
D:\>cd C\
系统找不到指定的路径。
D:\>cd /C
系统找不到指定的路径。
D:\>
正确的例子
- 标准方法
D:\>cd /d C: C:\>
- 推荐方法,更简单
C:\>D: D:\>
- 另一个用法,获取当前目录完整路径,即会输出当前目录的完整路径,就当linux的
pwd
来用好了
D:\personal\bat_workspace>cd
D:\personal\bat_workspace
D:\personal\bat_workspace>
4. 罗列文件:dir
就当做是linux的 ll
用法来用就好,使用的例子如下:
D:\personal\bat_workspace>dir
驱动器 D 中的卷是 新加卷
卷的序列号是 009E-ECFE
D:\personal\bat_workspace 的目录
2023/10/19 15:07 <DIR> .
2023/10/19 10:27 <DIR> ..
2023/10/19 15:08 116 example2.bat
2023/10/19 14:52 13 hello.txt
2023/10/19 15:06 56 mybat.bat
2023/10/19 14:49 2 test.txt
4 个文件 187 字节
2 个目录 244,904,079,360 可用字节
D:\personal\bat_workspace>
至于其他的用法,说明我也列一下(使用 dir /?
即可查看)
D:\personal\bat_workspace>dir /?
显示目录中的文件和子目录列表。
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]
[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。
/A 显示具有指定属性的文件。
属性 D 目录 R 只读文件
H 隐藏文件 A 准备存档的文件
S 系统文件 I 无内容索引文件
L 重新分析点 O 脱机文件
- 表示“否”的前缀
/B 使用空格式(没有标题信息或摘要)。
/C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
禁用分隔符显示。
/D 跟宽式相同,但文件是按栏分类列出的。
/L 用小写。
/N 新的长列表格式,其中文件名在最右边。
/O 用分类顺序列出文件。
排列顺序 N 按名称(字母顺序) S 按大小(从小到大)
E 按扩展名(字母顺序) D 按日期/时间(从先到后)
G 组目录优先 - 反转顺序的前缀
/P 在每个信息屏幕后暂停。
/Q 显示文件所有者。
/R 显示文件的备用数据流。
/S 显示指定目录和所有子目录中的文件。
请按任意键继续. . .
以上是第一篇相关分享,更多相关知识后边会慢慢分享出来~
如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~