• bat批处理脚本大全


       

    目录

        1、echo

        2、注释

        3、常见cmd命令

        4、参数与变量

        5、for循环

        6、函数

        7、数组


        在windows上编程或者制作一些小工具,少不了使用批处理脚本,而且在各种开发环境搭建中我们经常会看到批处理脚本。批处理脚本以cmd命令为基础,增加一些变量和参数构造多命令来完成复杂的任务。

        1、echo

         echo就是跟所有语言相似的输出打印命令,一般我们会在前面加上@前缀,表示不会显示打印语句。

    1. C:\Users\buejee\Desktop\battutorial>for %i in (1,3,5) do echo %i
    2. C:\Users\buejee\Desktop\battutorial>echo 1
    3. 1
    4. C:\Users\buejee\Desktop\battutorial>echo 3
    5. 3
    6. C:\Users\buejee\Desktop\battutorial>echo 5
    7. 5
    8. C:\Users\buejee\Desktop\battutorial>for %i in (1,3,5) do @echo %i
    9. 1
    10. 3
    11. 5

       我们也会调用@echo off关闭显示打印信息,这样后面的所有echo就不用加@前缀来隐藏命令。

    1. C:\Users\buejee\Desktop\battutorial>type bat_echo.bat
    2. echo hello
    3. @echo off
    4. echo world
    5. C:\Users\buejee\Desktop\battutorial>bat_echo.bat
    6. C:\Users\buejee\Desktop\battutorial>echo hello
    7. hello
    8. world

         在这个示例中,第一次没有设置@echo off,运行脚本,回显了echo hello,但是当运行echo world的时候,它没有回显,因为已经关闭了回显。

         echo表示输出,那么输入怎么办?这里要借助一个小技巧set /p 

    1. @echo off
    2. echo please input you name:
    3. set /p name=
    4. echo your name is : %name%

      运行:

     

        echo还可以结合>与>>命令向文件中写入和追加内容。 

    1. C:\Users\buejee\Desktop\battutorial>echo hello > hello.txt
    2. C:\Users\buejee\Desktop\battutorial>echo world >> hello.txt
    3. C:\Users\buejee\Desktop\battutorial>type hello.txt
    4. hello
    5. world
    6. C:\Users\buejee\Desktop\battutorial>echo hello,world > hello.txt
    7. C:\Users\buejee\Desktop\battutorial>type hello.txt
    8. hello,world
    9. C:\Users\buejee\Desktop\battutorial>

         其实这个示例里面隐含了一个操作,就是如果hello.txt文件不存在就创建,存在就覆盖或者追加。在linux下,我们新建一个文件可以使用touch命令,在windows命令行下,创建文件可以使用echo > xxx.txt 就可以了。 

         值得一提的是,因为cmd命令行默认编码是ANSI(936),而批处理脚本默认编码是UTF8(65001),所以在bat文件中使用echo输出中文会乱码。解决办法:要么改变cmd编码,要么改变脚本编码为ANSI。

        改变脚本编码,可以在notepad++里面直接使用 "编码" 菜单项:转为 ANSI 编码 修改,再一个办法就是通过记事本打开脚本,然后“另存为”的时候选择编码 ANSI,如下所示:

        2、注释

        任何语言都有注释,批处理脚本语言也不例外,它的注释,就是使用关键字REM,一般带上@前缀。

        在这个图中,可以看到,当使用REM关键字的时候,这一行内容就已经变为绿色高亮,明显与可以执行的语句有区别。 

        3、常见cmd命令

    windows命令行功能描述linux终端
    cd切换工作目录cd
    dir列出当前文件夹下所有文件ls [-lh]
    type查看文件内容cat
    md/mkdir创建目录mkdir
    del删除文件rm
    rd删除目录rm -r
    copy/xcopy拷贝cp [-r]
    cls清屏clear
    findstr根据关键字查找grep
    move/rename移动/重命名mv/rename
    tasklist查找进程ps [-ef]
    taskkill 杀死进程kill [-9]

       

        4、参数与变量

        在执行脚本的时候,我们可以在脚本后面跟上一些参数,这些参数我们在脚本中通过%1、%2、%3、%4依此类推类获取。

    1. @echo off
    2. @echo first param is %1
    3. @echo second param is %2
    4. @echo third param is %3
    5. @echo fourth param is %4

        运行脚本,打印如下: 

    1. C:\Users\buejee\Desktop\battutorial>bat_params.bat hello world 3 4
    2. first param is hello
    3. second param is world
    4. third param is 3
    5. fourth param is 4

        bat脚本参数只能表示%1~%9,也就是最多可以表示出9个参数。

         从这个脚本显示的样子可以看出,当表示%10的时候,其实已经无法表示了,只是表示%1后面拼接了一个0,所以第十个参数是10,第十一个参数是11,第十二个参数是12。

    1. C:\Users\buejee\Desktop\battutorial>bat_params.bat 1 2 3 4 5 6 7 8 9 9 9 9
    2. first param is 1
    3. second param is 2
    4. third param is 3
    5. fourth param is 4
    6. fifth param is 5
    7. sixth param is 6
    8. seventh param is 7
    9. eighth param is 8
    10. ninth param is 9
    11. tenth param is 10
    12. eleventh param is 11
    13. twelfth param is 12

        解决办法就是需要将前面的参数弹出。使用shift /1

        代码:

    1. @echo off
    2. @echo first param is %1
    3. @echo second param is %2
    4. @echo third param is %3
    5. @echo fourth param is %4
    6. @echo fifth param is %5
    7. @echo sixth param is %6
    8. @echo seventh param is %7
    9. @echo eighth param is %8
    10. @echo ninth param is %9
    11. shift /1
    12. @echo tenth param is %9
    13. shift /1
    14. @echo eleventh param is %9
    15. shift /1
    16. @echo twelfth param is %9

        运行结果:

    1. C:\Users\buejee\Desktop\battutorial>bat_params.bat 1 2 3 4 5 6 7 8 9 100 101 199
    2. first param is 1
    3. second param is 2
    4. third param is 3
    5. fourth param is 4
    6. fifth param is 5
    7. sixth param is 6
    8. seventh param is 7
    9. eighth param is 8
    10. ninth param is 9
    11. tenth param is 100
    12. eleventh param is 101
    13. twelfth param is 199

        变量赋值与取值:

        变量赋值语句使用“=”,且“=”两边没有空格。 取值的时候使用%%包裹,这个跟我们在命令行下打印系统环境变量的值一样:echo %JAVA_HOME%        在bat脚本中,for循环的变量,我们需要使用两个%%来表示,在cmd命令行下,可以使用一个%表示:

        bat_variable_in_forloop.bat

    1. @echo off
    2. for %%i in (1,2,3,5) do (
    3. @echo %%i
    4. )

        运行:

        以上这些都是自定义变量,还有一些系统内置的变量,可以方便我们在脚本中使用:

        %cd% 当前目录

        %os% 操作系统名称

        %date% 系统日期

        %time% 系统时间

        %username% 当前用户名

        在操作脚本的时候,想要得到脚本相关的参数:比如脚本属性、所在盘符、全路径名、文件名、 路径、缩写路径、文件最后修改时间、扩展名、文件大小、带盘符路径。就需要用到如下的变量:%~(a|d|f|n|p|s|t|x|z|dp)0。示例如下:

       bat_builtin_variable.bat

    1. @echo off
    2. @REM attribute
    3. @echo attr : %~a0
    4. @REM drive name
    5. @echo drive : %~d0
    6. @REM filename
    7. @echo filename : %~f0
    8. @REM name
    9. @echo name : %~n0
    10. @REM path
    11. @echo path : %~p0
    12. @REM short name
    13. @echo shortname : %~s0
    14. @REM time(modify)
    15. @echo time : %~t0
    16. @REM extension name
    17. @echo extensionname : %~x0
    18. @REM size
    19. @echo size : %~z0
    20. @REM drive name + path
    21. @echo dp : %~dp0

        运行结果如下:

        从中可以看出,name没有扩展名后缀.bat,path没有盘符c:,所以一般使用%~dp0来表示脚本路径。 缩写这里,如果一个文件夹名称不超过6个字符,则使用原样名称,只有文件名称超过6个字符,才使用缩写,而且缩写的名称会变大写。

        5、for循环

        for循环的语法是:

    1. for [/d/l/r/f] %%i in () do (
    2. )

         这里可以根据场景选择不同的参数:

         /d 表示获取某一目录下的所有文件夹

    1. @echo off
    2. for /d %%i in (%cd%\*) do (
    3. @echo %%i
    4. )

        运行结果:

         /l 可以使用一个序列来做循环,比如 (1,2,10)表示从1开始,10结束,步长为2,产生的序列为:(1,3,5,7,9)。(5,-1,1),表示从5开始,1结束,步长为-1,也就是递减数列(5,4,3,2,1)。

    1. @echo off
    2. for /l %%i in (1 2 10) do (
    3. echo %%i
    4. )

        运行结果:

         /r 可以获取某一个目录下所有的文件以及文件夹下的文件

    1. @echo off
    2. for /r %%i in (*.txt) do (
    3. @echo %%i
    4. )

        该脚本的意思是读取当前文件夹以及子文件夹下的所有.txt扩展名的文件。与/d遍历当前文件夹下的文件夹不同, 它不止遍历当前文件夹,还遍历子文件夹。

        运行结果:

         /f 读取文件

    1. @echo off
    2. for /f %%a in (user.txt) do (
    3. echo %%a
    4. )

        运行结果:

         我们准备的文件,user.txt里面是id,name,age三列按空格分割的五行数据,最后只读到了id这一列,因为/f默认是按照空格分隔来读取每一行第一列内容。

        可以增加一个"delims="的参数,表示不分割读取每一行。

    1. @echo off
    2. for /f "delims=" %%a in (user.txt) do (
    3. echo %%a
    4. )

        运行结果:

        还可以分割,并取分割之后的某几列,增加tokens参数:比如"tokens=1-3 delims= "表示按照空格分隔,取1到3列,也就是所有列,但是每一列在取的时候,需要按照%%a,%%b,%%c依次类推来取值。

    1. @echo off
    2. for /f "tokens=1-3 delims= " %%a in (user.txt) do (
    3. echo %%a - %%b - %%c
    4. )

        运行结果:

      /f 这里不仅可以读取文件,还可以用来读取系统命令执行的结果。

    1. @echo off
    2. for /f "usebackq tokens=1-5 delims= " %%a in (`netstat -aon^| findstr 135`) do (
    3. @echo %%a - %%b - %%c - %%d - %%e
    4. )

         这段脚本读取netstat -aon | findstr 135的结果,并按照空格分隔,取1-5列。

        运行结果:

        6、函数

        bat脚本里面的函数定义:采用冒号开头,然后定义函数名。在调用的时候,使用关键字call,同样的要跟上冒号:函数名。

        bat脚本有个特点,它虽然可以定义函数,因为脚本串行执行的特点,如果没有跳转指令控制的话,函数定义也会被当作指令执行,虽然函数没有被调用。

        如下所示的代码,我们定义了hello、world两个函数,我们只调用了world函数,但是最后运行结果很诡异:

    1. @echo off
    2. call :world
    3. :hello
    4. @echo hello
    5. goto :eof
    6. :world
    7. @echo world
    8. goto :eof

        运行结果:

    1. C:\Users\buejee\Desktop\battutorial>bat_func_test.bat
    2. world
    3. hello

        要想让上面的代码执行正确,我们需要在call :world函数之后增加 goto :eof的跳转控制:

        call除了可以调用函数之外,还可以调用其他脚本。

        7、数组

        和其他语言一样,数组在bat脚本中,可以直接通过set 命令设置,如下所示:

    1. @echo off
    2. set arr=1,3,5,7,9
    3. for %%a in (%arr%) do (
    4. @echo %%a
    5. )

        运行结果:

         这种方式定义的数组,却无法通过下标访问,它虽然可以通过for循环遍历并得到数组中的所有元素,但是却不能称为普通意义上的数组。这种一次性声明的数组,只能是一个类数组。

        在批处理脚本中,可以通过下标访问的数组,需要这样来定义:

    1. @echo off
    2. setlocal enabledelayedexpansion
    3. set a[0]=1
    4. set a[1]=3
    5. set a[2]=5
    6. set a[3]=7
    7. set a[4]=9
    8. set a[5]=11
    9. for /l %%n in (0,1,5) do (
    10. @echo !a[%%n]!
    11. )

        运行结果:

        这种数组,虽然可以通过下标访问,但是无法知道它的长度,在进行遍历的时候,我们不得不写死范围。可以通过如下的方式计算数组长度:

    1. @echo off
    2. set Arr[0]=1
    3. set Arr[1]=2
    4. set Arr[2]=3
    5. set Arr[3]=4
    6. set Arr[4]=5
    7. set "x=0"
    8. :loop
    9. if defined Arr[%x%] (
    10. set /a "x+=1"
    11. goto loop
    12. )
    13. echo the length is %x%

        运行结果:

    =======================================================

        批处理脚本与cmd命令行密切相关,所有在脚本中能够执行的操作,基本都可以在命令行下执行,但是有时候,命令行与脚本也有少许差别,比如在命令行下的for循环中,变量可以直接使用一个%来表示,但是脚本中必须使用两个%%来表示。 

  • 相关阅读:
    学院打卡第十一天
    金融时报:波场亮相哈佛大学并举办TRON Builder Tour活动
    Kotlin中的委托、属性委托和延迟加载
    【CesiumJS】(1)Hello world
    HPUX系统Oracle RAC如何添加ASM磁盘
    运维小技能:centos安装宝塔
    400企业热线电话
    从0开始学c语言-33-动态内存管理
    Java正则表达式基础用法
    Java基础进阶集合-Collection接口
  • 原文地址:https://blog.csdn.net/feinifi/article/details/127930417