李太吉的技术博客

人生到处知何似 应似飞鸿踏雪泥

0%

Windows bat语法

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.cccc0.01s

可以使用

1
2
3
4
5
6
7
8
:: 均为中文系统下
set year = %date:~,4%
set month = %date:~5,2%
set day = %date:~8,2%
set dayofweek = %date:~11,2%
set hour = %time:~0,2%
set minute = %time:~3,2%
set second = %time:~6,2%

控制流操作

if else

1
2
3
IF [NOT] ERRORLEVEL number command
IF [NOT] string1 == string2 command
IF [NOT] EXIST filename command

根据条件决定是否执行 command

注:

  1. ELSE 子句必须出现在同一行上的 IF 之后
  2. ELSE 命令必须与 IF 命令的尾端在同一行上。
  3. 最好将 IFELSE 子句中的 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
2
3
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

或者,如果有 usebackq 选项:

1
2
3
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') 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中使用双引号扩起文件名称。

注:

  1. 在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable ,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I

  2. FOR 变量是单一字母、分大小写和全局的变量; 而且,不能同时使用超过 52 个。

  3. 对于带有空格的文件 名,你需要用双引号将文件名括起来。为了用这种方式来使

     用双引号,还需要使用 `usebackq` 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。
    

& 、&& 和 ||

& 顺序执行多条命令,而不管命令是否执行成功。

&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令。

|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令。

管道操作

|

1
dir *.* /s/a | find /c "".exe""

管道命令表示先执行 dir命令,对其输出的结果执行后面的 find 命令。命令行结果:输出当前文件夹及所有子文件夹里的 .exe 文件的个数。

> 和 >>

> 清除文件中原有的内容后再写入。

>> 追加内容到文件末尾,而不会清除原有的内容。
主要将本来显示在屏幕上的内容输出到指定文件中,指定文件如果不存在,则自动生成该文件。

高级操作

start

启动一个单独的窗口以运行指定的程序或命令。

call

从批处理程序调用另一个批处理程序。

命令行参数

命令 作用
%0 批处理文件本身
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数