美文网首页
BAT批处理学习(一)

BAT批处理学习(一)

作者: 右耳菌 | 来源:发表于2023-10-19 10:35 被阅读0次

    一个导致我要学习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    <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          显示指定目录和所有子目录中的文件。
    请按任意键继续. . .
    

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


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

    相关文章

      网友评论

          本文标题:BAT批处理学习(一)

          本文链接:https://www.haomeiwen.com/subject/agxcidtx.html