批处理教程

BAT 概述

  1. 批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。可以使用任何文本文件编辑工具创建和修改。
  2. 批处理是一种简单的程序,可以用 if 和 goto 来控制流程,也可以使用 for 循环。
  3. 批处理的编程能力远不如C语言等编程语言,也十分不规范。(CMD 无法进行浮点数运算)
  4. 每个编写好的批处理文件都相当于一个DOS的外部命令,把它所在的目录放到 DOS 搜索路径(path)中,即可在任意位置运行。
  5. C:\AUTOEXEC.BAT 是每次系统启动时都会自动运行的,可以将每次启动时都要运行的命令放入该文件中。
  6. 大小写不敏感(命令符忽略大小写)
  7. 批处理的文件扩展名为 .bat 或 .cmd。
  8. 在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe来运行该文件。

变量

BAT 中的变量分为以下几种:

  • 系统变量:由系统定义好可以直接使用的,如 %os% 等,见附录-系统变量
  • 自定义变量:用户使用 set 命令定义的,用法同系统变量
  • 参数变量:命令中以空格分隔的字符串,使用 %[0-9]% 表示

BAT 的变量命名规则非常宽松:可以数字开头,不区分大小写。

1
2
3
::(枚举当前的环境变量)
setlocal enabledelayedexpansion
FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i !%%i!

参数变量

参数变量可以从%0%9%0表示批处理命令本身,其它参数字符串用 %1%9 顺序表示。

1
2
3
4
5
6
7
8
REM call test2.bat "hello" "haha"
REM (执行同目录下的“test2.bat”文件,并输入两个参数)

REM (在“test2.bat”文件里写:)
echo %1 (打印: "hello")
echo %2 (打印: "haha")
echo %0 (打印: test2.bat)
echo %19 (打印: "hello"9)

基本命令

REM

注释,不会被执行

语法:REM Message... (小技巧:用::代替 rem

注释命令,在 C 语言中相当与 //,它并不会被执行,只是起一个注释的作用,便于别人阅读和自己日后修改。

1
2
REM Here is the description.
::这是注释

HELP

显示命令的帮助信息

语法: 命令 /?

1
2
3
4
5
REM (把 type 命令的帮助信息写入到 tmp.txt 文件里)
type /?>>tmp.txt

REM (显示跟 `type /?` 一样)
HELP type

ECHO

打开或关闭后续命令行的回显

语法: echo [{on|off}] [message]

语法 功能
`ECHO [ON OFF]` 打开回显或关闭回显功能
ECHO 显示当前回显设置
ECHO [message] 显示信息

ECHO OFF 表示在此语句后所有运行的命令都不显示命令行本身;
默认是 ON,ON 时会显示如: C:\文件夹路径>命令行

在实际应用中我们会把这条命令和重定向符号( 也称为管道符号,一般用 > >> ^ )结合来实现输入一些命令到特定格式的文件中。

管道符号 说明
> 传递并覆盖,后面可以是文件也可以是默认的系统控制台
>> 传递并追加,类似于 >
& 允许在同一行中使用 2 个以上的命令,当前面的命令执行失败将不影响后续命令的执行
&& 类似 &,但当前面的命令失败时,后续命令将不再被执行
| 将前面的执行结果作为后面的输入内容,如执行ECHO %TIME%|CLIP会将当前时间放入剪切板中
|| && 相反,只有在前面的命令执行失败后,才会执行后续的命令
^ 前导字符,可用于对 >&^ 等特殊字符进行转义
1
2
3
4
5
6
7
8
9
10
11
REM (关闭回显)
ECHO OFF

REM (打印出“hello world”)
ECHO hello world`

REM (向文件 setupreg.reg 中覆盖内容)
ECHO Windows Registry Editor Version 5.00 > c:\setupreg.reg

REM (向文件 setupreg.reg 中追加内容)
ECHO "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg`

@

隐藏当前命令行

@后面的命令都将被隐藏,(在入侵过程中自然不能让对方看到你使用的命令啦)

@ECHO OFF 相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。

1
2
3
4
REM (此语句常用于开头,表示不显示所有的命令行信息,包括此句)
@ECHO OFF`

@ECHO please wait a minite...

SET

设置变量

语法:SET [{/a | /p}] name=value

SET 命令 说明
SET 列出所有可用变量
SET name 显示所有以 name 开头的变量的值
SET name= 设置变量 name 为空
SET name=1+2 被设定的变量将以%name%引用,其值为”1+2”
SET /a name=1+2 /a 表示会计算表达式 1+2 的值,并打印出结果
SET /a 1+2 计算并打印出结果
SET /p year=请输入您出生的年份 /p 表示提示输入,并将输入内容赋值给变量

IF

条件判断

将判断条件是否被满足,从而决定执行不同的命令。

语法:

  • IF [NOT] condition then_cmd ELSE else_cmd
  • IF [NOT] EXISTS file_name then_cmd ELSE else_cmd
  • IF ERRORLEVEL n then_cmd ELSE else_cmd

IF EXISTS 用于判断是否存在指定的文件。

IF ERRORLEVEL 用于判断程序的返回值。很多 DOS 程序在运行结束后会返回一个数字(返回码、ERRORLEVEL)来表示程序的运行结果,常见的返回码为 0、1。参见 CHOICE 命令

1
2
3
4
5
6
7
8
IF "%1" == "a" FORMAT a:
IF { %1 } == {} GOTO noparams

IF EXISTS config.sys EDIT config.sys

XCOPY F:\test.bat D:\
IF ERRORLEVEL 1 (ECHO 文件拷贝失败
) ELSE IF ERRORLEVEL ECHO 文件拷贝成功
比较运算符 说明
EQU 等于,一般使用==
NEQ 不等于,没有!=
LSS 小于
LEQ 小于或等于
GTR 大于
GEQ 大于或等于

GOTO

指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。

语法:GOTO label (label是参数,指定所要转向的批处理程序中的行。)

label 标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:”来表示这个字母是标签。

GOTO 命令就是根据这个冒号来寻找下一步跳到到那里。经常与 IF 配合使用,根据不同的条件来执行不同的命令组。

1
2
3
4
5
:begin
COPY a:*.** d:\back
ECHO Please put a new disk into driver A
PAUSE
GOTO begin

FOR

用于参数在指定的范围内循环执行命令

语法:FOR {$var | %%var} IN (set) DO cmd

%var 是一个单一的字母参数,变量是区分大小写的,所以 %i 不同于 %I。在批处理文件中,指定 FOR 的变量时建议使用 %%var 而不要使用 %var。

set 用于指定一个或一组文件,可以使用通配符。

如果命令的扩展名被启动,可以给 FOR 命令添加额外的参数:

  • FOR /D %var IN (set) DO cmd
    • 如果 set 里包含通配符,则指定与目录名匹配,而不与文件名匹配
  • FOR /R [dir] %var IN (set) DO cmd
    • 以 dir 为根的目录树进行匹配,默认为当前目录树
    • 如果 set 为单点(.),则枚举该目录树
  • FOR /L $var IN (start, step, end) DO cmd
    • 表示 set 是一个从 start 到 end 以 step 自增的数字序列
    • 如 (1, 1, 5),将产生序列 1 2 3 4 5
  • FOR /F ["options"] %var IN (set) DO cmd

CHOICE

让用户输入一个字符,并将其位置会赋予 errorlevel 变量,一般与 IF命令 配合使用。

语法:CHOICE [/C choices] [/N] [/CS] [/T timeout /D def_choice] [/M msg]

常用参数 功能
/C choices 指定选项值,默认为 [Y/N]
/N 隐藏选项值
/CS 区分大小写,默认是不分大小写的
/T timeout /D def_choice 若用户没有在指定时间(timeout)内做出选择,则会选择一个默认值(def_choice)
/M msg 设置提示信息
1
CHOICE /C YNC /M "请选择:Y.确认,N.否,C.取消"

PAUSE

暂停批处理

会在屏幕上显示 Press any key to continue… 的提示,等待用户按任意键后继续。

1
2
3
4
5
6
@ECHO OFF
:begin
COPY a:*.* d:\back
ECHO Please put a new disk into driver A
PAUSE
GOTO begin

在这个例子中,驱动器 A 中磁盘上的所有文件均复制到 d:\back 中。
显示的信息提示您将另一张磁盘放入驱动器 A 时,PAUSE 命令会使程序挂起,以便您更换磁盘,然后按任意键再次复制。

CALL

调用另一个批处理程序,并且不终止父批处理程序。

语法: CALL [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。

filename 参数必须具有 .bat 或 .cmd 扩展名。

如果不用 CALL 而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。

CALL 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 CALL,它将不会在命令行起作用。

1
2
REM (调用同目录下的 test2.bat,且输入2个参数给他)
CALL test2.bat arg1 arg2

START

调用外部程序,所有的 DOS 命令 和 命令行程序 都可以由 START 命令 来调用。

入侵常用参数 功能
/MIN 开始时窗口最小化
/SEPARATE 在分开的空间内开始 16 位 Windows 程序
/HIGH 在 HIGH 优先级类别开始应用程序
/REALTIME 在 REALTIME 优先级类别开始应用程序
/WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
1
2
3
4
REM (调用同目录下的 test2.bat,且输入2个参数给他,且本窗口最小化)
START /MIN test2.bat arg1 arg2

START e:\"program files"\极品列车时刻表\jpskb.exe

文件处理

DIR

显示目录中的文件列表

语法:DIR [path] [options]

选项 说明
/a:atrributes attributes, 过滤属性:D 目录,R 只读文件,H 隐藏文件,A 准备存档文件,S 系统文件,- 否前缀
/b 使用空格式(没有标题信息和摘要)
/o:sort_order order, 指定排序规则:N 按名称,S 按大小,E 按扩展名,D 按日期,G 目录优先,- 否前缀
/s sub, 显示子目录中的文件

DEL

删除文件(不包括文件夹)

语法:DEL [options] path

选项 说明
/s sub, 连子目录下的文件也一起删除
/q quite, 删除子目录下的文件时将不显示提示
/p prompt, 删除每一个文件之前都显示提示
/f force, 强制删除只读文件
/a attributes, 根据属性选择要删除的文件

RMDIR

删除文件夹

语法:RMDIR [/q] [/s] path

字符串处理

分割字符串

语法:"%source:~start,length%"

起始值从0开始,截取的长度是可选的。

  • 如果省略逗号和截取长度,将截取到结尾。
  • 如果长度是负数,表示截取到倒数第几个。
CMD 表达式 说明
"%TIME%" 显示完整的时间格式(hh:mm:ss.tt),如:11:04:23.03
"%TIME:~0,5%" 显示 hh:mm,如 11:04
"%TIME:~3,-3% 显示 mm:ss,-3 表示去掉后面 3 个字符
"%TIME:~-2%" 显示 tt,从倒数第 2 个字符开始,截取到末尾

替换字符串

语法:%souce:old:new%

1
2
3
SET a = "abc123"
SET a = %a:123=def%
ECHO %a% (将显示 abcdef)

合并字符串

语法:%str1%%str2%

附录

系统变量

变量
%CD% 当前目录
%DATE% 当前日期
%TIME% 当前时间
%RANDOM% 获取一个介于 0 ~ 32767 之间的随机整数
%ERRORLEVEL% 获取当前 ERRORLEVEL 的数值
%CMDEXTVERSION% 获取当前命令行处理器扩展名版本号
%CMDCMDLINE% 获取调用该命令行处理器的原始命令行
%SYSTEMROOT% C:\WINDOWS (%WINDIR% 同样)
%PROGRAMFILES% C:\Program Files
%USERPROFILE% C:\Documents and Settings\Administrator (子目录有“桌面”,“开始菜单”,“收藏夹”等)
%APPDATA% C:\Documents and Settings\Administrator\Application Data
%TEMP% C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同样)
%OS% Windows_NT (系统)
%PATH% %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的设置)
%HOMEDRIVE% C: (系统盘)
%HOMEPATH% \Documents and Settings\Administrator

参考链接