Windows bat 语法
注释
命令 | 作用 |
---|---|
:: |
注释无回显 |
rem |
注释有回显 |
命令帮助
命令 | 作用 |
---|---|
<command> /? |
返回 <command> 命令的帮助 |
基础操作
echo
命令 | 作用 |
---|---|
echo text |
在命令行中回显 text |
echo off |
从下一行开始关闭回显 |
@echo off |
从本行开始关闭回显 |
echo on |
从下一行开始开启回显 |
@echo on |
从本行开始开启回显 |
dir
命令 | 作用 |
---|---|
dir |
显示当前目录中的文件和子目录 |
dir /a |
显示当前目录中的文件和子目录,包括隐藏文件和系统文件 |
dir /a:d |
显示当前目录中的目录 |
dir /a:-d |
显示 当前目录中的文件 |
dir /b/p |
/b 只显示文件名,/p 分页显示 |
dir *.exe /s |
显示当前目录和子目录里所有的 .exe 文件。通配符 * ,? 。 |
cd
命令 | 作用 |
---|---|
cd .. |
返回上一级目录 |
cd /d <path> |
同时改变盘符和目录 |
目录操作
命令 | 作用 | |
---|---|---|
`md | mkdir |
创建目录(包含子目录) |
`rd | rmdir |
删除空目录 |
rd /q/s <path> |
/q 安静模式 ,/s 递归 |
|
`ren | rename |
将目录 oldName 重命名为 newName |
pushd 和 popd
1 | pushd <path> |
保存当前目录,并切换当前目录为 <path>
。
1 | popd |
恢复当前目录为栈顶目录。
文件操作
命令 | 作用 |
---|---|
cd > test.txt |
创建文件 test.txt ,可以使用 > 重定位操作符创建文件并写入数据 |
type test.txt |
查看文件 test.txt 内容 |
del test.txt |
删除文件 test.txt ,不能是隐藏、系统、只读文件 |
del /q/a/f d:\temp\*.* |
删除 d:\temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 |
del /q/a/f/s d:\temp\*.* |
#删除 d:\temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 |
copy
命令 | 作用 |
---|---|
copy key.txt c:\doc |
将当前目录下的 key.txt 拷贝到 c:\doc 下(若 doc 中也存在一个 key.txt 文件,会询问是否覆盖) |
参数 | 作用 |
---|---|
/Y |
不使用确认是否要覆盖现有目标文件 |
/-Y |
使用确认是否要覆盖现有目标文件的提示 |
xcopy
xcopy
命令类似copy
,但功能更加强大。
move
move
指令的用法基本同上。
时间操作
date
显示和设置当前日期。在 bat
文件中用 %date%
来调用当前日期,格式一般为 yyyy/MM/dd 周一
。
time
显示和设置当前日期。在 bat
文件中用 %time%
来调用当前日期,格式一般为 HH:mm:ss.cc
,cc
为0.01s
。
可以使用
1 | :: 均为中文系统下 |
控制流操作
if else
1 | IF [NOT] ERRORLEVEL number command |
根据条件决定是否执行 command
。
注:
ELSE
子句必须出现在同一行上的IF
之后ELSE
命令必须与IF
命令的尾端在同一行上。- 最好将
IF
和ELSE
子句中的command
用()
包围起来。
1 | IF [/I] string1 compare-op string2 command |
其中,/I
指定比较不区分大小写;compare-op
可以是:
操作符 | 作用 |
---|---|
EQU | 等于 |
NEQ | 不等于 |
LSS | 小于 |
LEQ | 小于或等于 |
GTR | 大于 |
GEQ | 大于或等于 |
for
1 | FOR %variable IN (set) DO command [command-parameters] |
在批处理程序中使用 FOR
命令时,指定变量请使用 %%variable
,而不要用 %variable
。变量名称是区分大小写的,所以 %i
不同于 %I
。
1 | FOR /D %variable IN (set) DO command [command-parameters] |
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
1 | FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] |
检查以[drive:]path
为根的目录树,指向每个目录中的 FOR
语句。
如果在 /R
后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)
字符,则枚举该目录树。
1 | FOR /L %variable IN (start,step,end) DO command [command-parameters] |
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)
将产生序列 1 2 3 4 5
,(5,-1,1)
将产生序列(5 4 3 2 1)
。
1 | FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] |
或者,如果有 usebackq
选项:
1 | FOR /F ["options"] %variable IN (file-set) DO command [command-parameters] |
fileset
为一个或多个文件名。继续到 fileset
中的下一个文件之前,每份文件都被打开、读取并经过处理。处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For
循环。 以默认方式,/F
通过每个文件的每一行中分开的第一个空白符号。跳过空白行。你可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:
关键字 | 作用 |
---|---|
eol=c |
指一个行注释字符的结尾(就一个) |
skip=n |
指在文件开始时忽略的行数。 |
delims=xxx |
指分隔符集。这个替换了空格和制表符的默认分隔符集。 |
tokens=x,y,m-n |
指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n 格式为一个范围。通过 nth 符号指定 mth 。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。 |
usebackq |
指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 file-set 中使用双引号扩起文件名称。 |
注:
在批处理程序中使用
FOR
命令时,指定变量请使用%%variable
,而不要用%variable
。变量名称是区分大小写的,所以%i
不同于%I
。FOR
变量是单一字母、分大小写和全局的变量; 而且,不能同时使用超过52
个。对于带有空格的文件 名,你需要用双引号将文件名括起来。为了用这种方式来使
用双引号,还需要使用 `usebackq` 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。
& 、&& 和 ||
&
顺序执行多条命令,而不管命令是否执行成功。
&&
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令。
||
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令。
管道操作
|
1 | dir *.* /s/a | find /c "".exe"" |
管道命令表示先执行 dir
命令,对其输出的结果执行后面的 find
命令。命令行结果:输出当前文件夹及所有子文件夹里的 .exe
文件的个数。
> 和 >>
>
清除文件中原有的内容后再写入。
>>
追加内容到文件末尾,而不会清除原有的内容。
主要将本来显示在屏幕上的内容输出到指定文件中,指定文件如果不存在,则自动生成该文件。
高级操作
start
启动一个单独的窗口以运行指定的程序或命令。
call
从批处理程序调用另一个批处理程序。
命令行参数
命令 | 作用 |
---|---|
%0 |
批处理文件本身 |
%1 |
第一个参数 |
%9 |
第九个参数 |
%* |
从第一个参数开始的所有参数 |