在cmd.exe中重复输入cmd是一件烦人的事情,如何才能节省时间?批处理脚本是不错的方式。基本上,只要把在cmd.exe中输入的命令一行一行放入*.bat脚本中就可以了。同时,bat脚本功能更加强大。日常工作中经常碰到需要设置环境变量,清理编译残留等,此时可以自己动手写bat脚本。可惜的是,现在网上找不到比较系统的教程。下面是我从网络中搜集过来的,日后会不断的完善。
Section 1, 输入,输出
1, ::
BAT脚本中的注释
2, @
执行窗口中不显示它后面这一行的命令本身。
::a.bat
@echo 'hello world!'
::b.bat
echo 'hello world!'
3, echo
显示信息,类似于C语言函数puts,或将命令回显打开或关上。
ECHO [ON | OFF]: ECHO OFF 后的所有命令都不会显示命令本身,除非执行ECHO ON命令。
ECHO [message]
要显示当前回显设置,键入不带参数的 ECHO。
4,pause
暂停此批处理程序,并显示消息: ‘请按任意键继续...’,类似于C语言中函数getchar。
5, %
BAT脚本命令行传递参数
::a.bat arg1 arg2 arg3
echo %1 %2 %3
::%1是参数1,%2是参数2, %3是参数3
6, >,>>, <, |
重写向和管道,类似于Linux下的重写向和管道。
Section 2, 变量
1, 变量
(a)定义变量
set [variable=[string]], 注意没有空格
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
set变量中的开关: /A 和 /P
set /A expression 指定等号右边的字符串为被评估的数字表达式。
set /P variable=[promptString] 允许将变量数值设成用户输入的一行输入。
查看关于set的更多详细内容,可以在cmd.exe中输入help set
**子字符串提取(工作中经常用到)**
示例:
%PATH:~10,5%
会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
会提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
会提取 PATH 变量的所有字符,除了最后两个。
**子字符串替换**
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
(b)获取变量值
%variable%
获取变量variable的值。
**系统定义变量**
%CD% - 扩展到当前目录字符串。
%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
Section 3, 语句控制
1, if
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT 指定只有条件为 false 的情况下,Windows 才应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。通常情况下,没有错误时退出代码为0。退出代码非0,可能存在错误。
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令。
ELSE 子句必须出现在同一行上的 IF 之后。例如:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
由于 del 命令需要用新的一行终止,因此以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing
如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
2, for
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
**示例**
FOR %%C IN (*.bat *.txt) DO ls -l %%C
for %%i in (t*.*) do @echo %%i
**命令扩展**
FOR /D %variable IN (set) DO command [command-parameters]
/D 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
/R 检查以 [drive:]path 为根的目录树,包括其子目录。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
/L 该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
@echo off
FOR /L %%i IN (0, 2, 100) DO (
echo %%i
echo ***
)
@echo on
3, goto和:
goto跳转与C/C++类似,:用于在批处理文件中定义标签。
::a.bat
goto USAGE
...
:USAGE
...
**示例**
@echo off
set n=%1
set i=0
:loop
set /A i=%i%+1
echo Bang!
if %i%==%n% goto end
goto loop
:end
Section 4, 工具Utils
1,taskkill, tasklist
tasklist /FI "IMAGENAME EQ CHROME*" 列出所有chrome*进程
TASKKILL /F /IM cmd.exe /T
2, start
启动一个单独的窗口运行指定的程序或命令。
start cmd
3, call
从批处理程序调用另一个批处理程序。
Section 1, 输入,输出
1, ::
BAT脚本中的注释
2, @
执行窗口中不显示它后面这一行的命令本身。
::a.bat
@echo 'hello world!'
::b.bat
echo 'hello world!'
3, echo
显示信息,类似于C语言函数puts,或将命令回显打开或关上。
ECHO [ON | OFF]: ECHO OFF 后的所有命令都不会显示命令本身,除非执行ECHO ON命令。
ECHO [message]
要显示当前回显设置,键入不带参数的 ECHO。
4,pause
暂停此批处理程序,并显示消息: ‘请按任意键继续...’,类似于C语言中函数getchar。
5, %
BAT脚本命令行传递参数
::a.bat arg1 arg2 arg3
echo %1 %2 %3
::%1是参数1,%2是参数2, %3是参数3
6, >,>>, <, |
重写向和管道,类似于Linux下的重写向和管道。
Section 2, 变量
1, 变量
(a)定义变量
set [variable=[string]], 注意没有空格
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
set变量中的开关: /A 和 /P
set /A expression 指定等号右边的字符串为被评估的数字表达式。
set /P variable=[promptString] 允许将变量数值设成用户输入的一行输入。
查看关于set的更多详细内容,可以在cmd.exe中输入help set
**子字符串提取(工作中经常用到)**
示例:
%PATH:~10,5%
会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
会提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
会提取 PATH 变量的所有字符,除了最后两个。
**子字符串替换**
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
(b)获取变量值
%variable%
获取变量variable的值。
**系统定义变量**
%CD% - 扩展到当前目录字符串。
%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
Section 3, 语句控制
1, if
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT 指定只有条件为 false 的情况下,Windows 才应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。通常情况下,没有错误时退出代码为0。退出代码非0,可能存在错误。
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令。
ELSE 子句必须出现在同一行上的 IF 之后。例如:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
由于 del 命令需要用新的一行终止,因此以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing
如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
2, for
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
**示例**
FOR %%C IN (*.bat *.txt) DO ls -l %%C
for %%i in (t*.*) do @echo %%i
**命令扩展**
FOR /D %variable IN (set) DO command [command-parameters]
/D 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
/R 检查以 [drive:]path 为根的目录树,包括其子目录。
如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
/L 该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
@echo off
FOR /L %%i IN (0, 2, 100) DO (
echo %%i
echo ***
)
@echo on
3, goto和:
goto跳转与C/C++类似,:用于在批处理文件中定义标签。
::a.bat
goto USAGE
...
:USAGE
...
**示例**
@echo off
set n=%1
set i=0
:loop
set /A i=%i%+1
echo Bang!
if %i%==%n% goto end
goto loop
:end
Section 4, 工具Utils
1,taskkill, tasklist
tasklist /FI "IMAGENAME EQ CHROME*" 列出所有chrome*进程
TASKKILL /F /IM cmd.exe /T
2, start
启动一个单独的窗口运行指定的程序或命令。
start cmd
3, call
从批处理程序调用另一个批处理程序。
4, sort, chidr, comp, fc, find, ver
Section 5, 其它
1, @echo off
set foo="helloworld"
if %foo%=="helloworld" (
set foo="helloubuntu"
echo %foo%
)
输出什么? helloubuntu? No!
batch解释器到底是怎么执行的?
1.首先,解释器执行if判断为真,解释器对后面的cmd进行语法验证、执行(读整个句子时并不执行)等操作
2.读完整个句子后,解释器会进行一项变量扩展(也就是我们熟知的变量替换)的工作,batch特有的语法是两个%之间的变量(上面的%foo%就是)会被替换
3.完成替换工作后,解释器开始执行这个整句。
因为输出结果为helloworld
@echo off
setlocal enabledelayedexpansion
set foo="helloworld"
if %foo%=="helloworld" (
set foo="helloubuntu"
echo %foo%
)