BAT批处理学习(一)

一个导致我要学习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

  1. 键入以下信息
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
请按任意键继续. . .
  1. 如果要取消输入指令的输出,即取消类似D:\personal\bat_workspace>****的显示,只需要在具体指令之前加入@,修改后的内容如下:
@echo hello,world
@echo my name is neco
@pause

执行结果如下:

hello,world
my name is neco
请按任意键继续. . .
  1. 也可以在bat脚本前面使用@echo off关闭输入指令的输出
@echo off
echo hello,world
echo my name is neco
pause

该方法与上边 2 的执行效果一致

  1. 如果要输出空行,即相当于只有一个回车,则可以使用
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>
  1. 可以使用echo将内容写入到指定文件中,如果文件不存在则会创建文件
  • 输出内容到指定文件
D:\personal\bat_workspace>echo hello,world>hello.txt

查看文件


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              .
2023/10/19  10:27              ..
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          显示指定目录和所有子目录中的文件。
请按任意键继续. . .

以上是第一篇相关分享,更多相关知识后边会慢慢分享出来~


如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

你可能感兴趣的:(BAT批处理学习(一))