Table of Contents
获取帮助信息
- 使用
help查看cmd帮助信息 - 使用
command /?查看命令帮助信息
外国网友写的简易Batch教程
基本概念
评论
REM This is a comment!
::This is a comment!
也可以,但是好像和FOR循环混在一起的时候会有bug。
关闭代码显示
@ECHO OFF
变量
环境变量
SET foo=bar
ECHO %foo%
/A选项允许数学运算
SET /A foo=2+2
特殊环境变量: TEMP(临时目录), RANDOM(随机数), CD(当前目录), ERRORLEVEL(上个命令返回值,正常退出的话一般应该返回0)。
变量范围默认是全局的,如果想要局部的,使用SETLOCAL和ENDLOCAL。
控制流
IF
IF [NOT] CONDITION (
...
) ELSE (
...
)
CONDITION可以是DEFINED, EXIST等关键字,也可以用compare-op:EQU、NEQ、LSS、LEQ、GTR、GEQ。比较字符串是否相等可以用==符号,可以用/I忽略大小写区别。
FOR
FOR %variable IN (set) DO command [command-parameters]
- 在batch脚本中,需要使用
%%variable - 对于set可以直接用逗号分隔的形式枚举要遍历的值,如
(1, 2, 3);也可以也用通配符的方式来获得相匹配的文件/文件夹名称的集合,如(*.pcm)。 - 几个简单选项:
/D只匹配目录FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]对于以[drive:]path为根的目录树,对其下的每个目录都执行一遍后面的FOR语句。FOR /L %variable IN (start, step, end) DO command [command-parameters]以start和end为开始和结束(均包含),以step为步进,产生一个序列,对这个序列中的每个值进行遍历。
- 更复杂的选项:
FOR /F ["options"] %variable IN (file-set|"string"|'command') DO command [command-parameters]
“options”可选关键字列表:
| 关键字 | 含义 |
|---|---|
| eol=c | 指一个行注释字符的结尾(就一个) |
| skip=n | 指在文件开始时忽略的行数 |
| delims=xxx | 分隔字符集。默认是用空格和制表符作分隔字符集 |
| tokens=x,y,m-n | 看不懂windows的说明,估计机器翻译的吧 |
| usebackq | 同看不懂 |
FOR变量的替换
| 语法 | 含义 |
|---|---|
| %~I | 删除任何引号(“),扩展%I |
| %~fI | 将%I扩展到一个完全合格的路径名 |
| %~dI | 仅将%I扩展到一个驱动器号 |
| %~pI | 仅将%I扩展到一个路径 |
| %~nI | 去掉扩展名,仅保留文件名 |
| %~xI | 仅保留扩展名 |
| %~sI | 扩展的路径只含有短名 |
| %~aI | 将%I扩展到文件的文件属性 |
| %~tI | 将%I扩展到文件的日期/时间 |
| %~zI | 将%I扩展到文件的大小 |
| %~$PATH:I | 根据$PATH指定的路径,找到第一个和名为%I的文件,并将%I扩展为该文件的fully qualified name。如果找不到就将%I扩展为空字符串。 |
可以同时使用多个修饰符,如%~ftzaI。
%I可以用其他的循环变量替代,PATH变量也可以用其他有效数值替代。但是%~语法必须用一个有效的FOR循环变量终止。
FOR循环的一个坑爹之处在于需要理解并运用ENABLEDELAYEDEXPANSION这种机制,否则你会发现FOR循环并没有如你想象中那样工作。
函数(FUNCTION/PROCEDURE)
定义函数
类似于定义C里面的一个label:
:foo
ECHO I am a fool!
调用函数
CALL foo arg1 arg2 [...]
返回值
EXIT /B
在调用函数后,可以读取%ERRORLEVEL%以获得其返回值。
函数的结束
函数可以用EXIT /B [RETURN VALUE]返回,也可以用GOTO :EOF结束一个函数。
如何避免main logic落入函数的代码块:
可以用EXIT /B [RETURN VALUE]或者用GOTO :EOF。
函数参数/命令行参数
| 参数名 | 含义 |
|---|---|
| %0 | 脚本名/函数名 |
| %1 | 第一个参数 |
| %2 | 第二个参数 |
| … | … |
可以用shift操作丢弃第一个参数,再把后面的参数依次往前移动,即将第二个参数从%2的位置移到%1,第三个参数从%3的位置移到%2的位置,依次类推。
对于函数参数或者命令行参数可以使用FOR循环的各种扩展修饰符。
使用命名参数
SET VAR1=%1
SET VAR2=%2
延迟展开 (DELAYED EXPANSION)
SETLOCAL ENABLEDELAYEDEXPANSION
使用!variable!而不是%variable%以阻止解释器在读入脚本的时候就把变量值给展开了(这往往不是我们想要的)。如果想要使用Delayed Expansion,那么对于指定的变量在任何时候都应该使用!variable!,不要混用%variable%。
更高级的脚本编程
需要使用PowerShell。

近期评论