Windows 批处理

作者 Marlous 日期 2018-10-06
Windows 批处理

参考文章:http://www.cn-dos.net/newdos/dosuse.htm#dosbat
参考文章:百度百科
参考文章:脚本之家

一 概述

批处理是一种简化的脚本语言,也称作宏。它应用于 DOS 和 Windows 系统中,它是由 DOS 或者 Windows 系统内嵌的命令解释器(通常是 COMMAND. COM 或者 CMD.EXE)解释运行。类似于 Unix 中的 Shell 脚本。

二 具体命令

1 命令

  • echo
    echo on 或 echo off 来打开或关闭回显,echo off 等效 @,但它是一个单独的命令,而不能像@那样放在其它命令之前,常在开头用 @echo off 不显示批处理过程。
    显示指定的信息。通常显示在屏幕上。在实际应用中我们会把这条命令和重定向符号结合来实现输入一些命令到特定的文件中。

  • rem
    用来注释。

  • pause
    暂停,会挂起批处理。显示 Press any key to continue

  • call
    从一个批处理程序调用另一个批处理程序,调用完后继续执行原来的批文件,是调用,可以相互传值。
    call c:\document\test.bat

  • start
    调用外部程序,所有的 DOS 命令和命令行程序都可以由 start 命令来调用,是执行,只能单向传值给被调用程序。
    start calc.exe

  • goto
    程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。

    1
    2
    3
    goto labeltest
    :labeltest
    XXX
  • set
    显示、设置或删除变量。
    显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以 s 开头的变量及值。
    设置和调用变量:set a=7,调用变量加百分号 echo %a%

  • choice:
    选择语句。
    例:

    1
    2
    3
    set /p choice=是否显示当前时间?(y/n)
    if /i not %choice% EQU n echo 当前时间是:%date% %time%
    pause

2 符号

  • @
    不显示此条命令。echo off 不显示所有命令。

  • > 和 >>
    将输出信息重定向到指定的设备或文件。系统默认输出到显示器。后者为追加。

  • <
    将输入信息来源重定向为指定的设备或文件。系统默认从显示器读取输入信息。
    例:从 a.txt 文件输入给变量 input,注意 set 命令有个参数 /p

    1
    2
    3
    4
    5
    @echo off
    set /p input=<a.txt
    echo content:
    echo %input%
    pause
  • |
    管道命令,将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。

  • ^
    转义符。
    echo aaaa^>test.txt

  • &、&&、||
    &:它的作用是用来连接多个 DOS 命令,并把这些命令按顺序执行,而不管是否有命令执行失败。
    &&:当 && 前面的命令成功执行时,执行 && 后面的命令,否则不执行。
    ||:当 || 前面的命令失败时,执行 || 后面的命令,否则不执行。

三 语句结构

1 if 语句

  1. 字符串比较:
    /i 则不区分字符串大小写;选择 not 项,则对判断结果进行逻辑非。
    == 等于,EQU 等于,NEQ 不等于,LSS 小于,LEQ 小于或等于,GTR 大于,GEQ 大于或等于。
    也可以用数学符号,但注意要转义。

  2. 存在判断:
    存在判断的功能是判断文件或文件夹是否存在。

    1
    2
    if not exist filename (command1) else (command2)
    rem 单个命令可不加括号。
  3. 定义判断:
    定义判断的功能是判断变量是否存在,即是否已被定义。
    例:

    1
    2
    set var=111
    if defined var (echo var=%var%) else echo var尚未定义!
  4. 结果判断:

    1
    2
    3
    masm test.asm
    if errorlevel 1 pause & edit test.asm
    link %1.obj

先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用 link 程序连接生成的 obj 文件,这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS 程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为 1),则执行相应的操作(这里相应的操作为 pause & edit %1.asm 部分)。

2 for 语句

for /参数 %%变量 in (集) do 命令(命令行用一个百分号,批处理中一定用两个。),分四种参数 D L R F,并且有的参数还可附加另外的选项。

for 命令会在每次循环中,把 in (集) 中读取到的值赋于这个变量,以便其后的命令中引用。
由系列文件、字符串或由命令产生的内容形成的集合(当然可用通配符 * ?,还可引用环境变量),for 命令是按一定顺序和规律分次读取集中内容,赋值给变量,并执行 do 后的命令,进行循环下一轮,直至集中内容读取完毕。

  • /d 参数是指定仅对目录而不是文件。例 for /d %%a in (c:\*) do echo %a 表示列出 c 盘根目录下的目录。
  • /r 此参数后可以带有路径,在 /r 之后的那个路径,指包含它之下的整个目录树。
  • /l for /L %%变量 in (起始值,每次增值,结束时的比较值) do 命令,例:在 D 盘建立 aa1~ aa5 五个文件夹 for /L %%i in (1,1,5) do mk d:\aa%%i
  • /f 会打开(集)里的文件,使 for 命令能处理文本文件的读取和添加删除替换等编辑性的操作。 /f 后还可跟参数,无则默认以空格为分隔。
    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
    假定d:\abc.txt内容如下:
    姓名 性别 年龄 等-级
    张三 男 36 A-1
    李四 男 29 B-2
    赵六 女 31 A-2

    /f 后无参数:
    for /f %c in (d:\abc.txt) do @echo %c
    则屏幕上显示:
    姓名
    张三
    李四
    赵六

    /f 后有参数:
    for /f “skip=1 tokens=1,4 delims= ” %c in (d:\abc.txt) do @echo %c %d
    显示为:
    张三 A-1
    李四 B-2
    赵六 A-2

    按需要是否“忽略几行”(skip=);
    “用什么刀来切分”(delims=)始终空格都会被切分;
    “最多只需取哪几段”(tokens=)将集里形成的字符串,
    逐行地分段赋给 % 或 %% 后的变量及可能顺延扩展出的变量,
    以执行 do 后的命令,每一行即为一轮循环。

四 字符串

  • 截取字符串:%string:~0,5% 表示从第 0 个字符开始,长度为 5。
  • 替换字符串中的某个字符:%string:hi=hello% 表示将 string 变量的字符串中的 hi 换成 hello。
  • 字符串合并:直接写在一起,%string1%%string2%
  • 扩充字符串:扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,该路径字符串变量用 %x 表示,例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    echo 完全路径:%0
    echo 去掉引号:%~0
    echo 所在分区:%~d0
    echo 所处路径:%~p0
    echo 文件名:%~n0
    echo 扩展名:%~x0
    echo 文件属性:%~a0
    echo 修改时间:%~t0
    echo 文件大小:%~z0
    其中的 %0 是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有 %1-%9,分别代表传递来的第 1-9 个参数。

    凡是 %~ 打头的操作符,都是文件名或环境变量的分离操作。

五 数值计算

和 C 语言类似。

六 传递参数

传参数:

1
2
例:把参数传给 test.bat
call test.bat a b c

接收参数:

1
2
3
例:test.bat 的内容,用 %1 %2 ... %9 来对应传入的参数。
rem 输出传入的参数 a b c
echo %1 %2 %3