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。
近期评论