今天细看了下VS2012用到的的批处理命令脚本VsDevCmd.bat,发现自己对bat脚本还有很多需要学习的地方,很多用法并不像我之前想得那么简单,今天我在控制台(cmd.exe)上把上面遇到的每个命令都用“/?”参数查了下用法。查到的用法是汉字的,不过怎么看怎么觉得是机器翻译的,非常生硬。所以我想我还是应该写篇blog总结下。
查看一个bat命令帮助信息的方法:在cmd中输入“命令 /?”,如“call /?”
1.call命令
使用call命令可以从批处理程序调用另一个批处理程序。
<用法1> call [drive:][path]filename [batch-parameters]
调用另一个批处理,在被调用的批处理执行完后在执行call下面的命令。如果在被调用的批处理里面有参数,调用的时候需要在后面加上参数。
<用法2> call :label arguments
这个用法会让程序跳转到call语句后面的标签中。不过与goto不同的是,goto语句则会让程序无条件跳转到指定标签继续执行,而call语句相当于执行一个新的与当前批处理文件一模一样的批处理文件,并从这个标签的位置开始运行,运行结束后(运行到脚本的最后),再返回调用它的call语句,继续执行call语句的下一句。
2.goto命令
<用法> goto :label
goto语句无条件跳转到标签:label处继续执行批处理脚本。标签必须用一个冒号开头,一个标签单独占据一行的位置。如果不进行重定义,默认标签“:eof”代表一个批处理文件的结尾,使用语句“goto :eof”可以退出批处理脚本文件。
3.set命令
<用法> set [variable=[string]]
variable即指定环境变量名,string即指定要指派给变量的一系列字符串。
set命令用于设置环境变量
1)如果在当前环境中找不到该变量名称,set命令将把errorlevel设置成1,用变量%errorlevel%可以查看errorlevel的值
2)set命令不允许变量名含有等号
3)set命令的两个参数
set /A expression
/A 可以用来指定等号右边的字符串为被评估的数字表达式
set /P variable=[PromptString]
/P 将变量数值设置成用户输入的一行输入,并在读取输入行之前,显示指定的“PromptString”(可以是空的)
PromptString即提示字符,每次输入命令前出现在最左侧的文字(如cmd刚进入时的“C:\User\用户名>”)
4)使用命令“echo %环境变量名%”可以查看设置的环境变量
5)输入不带参数的set可以查看当前命令提示符已定义的环境变量
6)但是set无法显示出一些命令行自带的环境变量,它们是:
%CD% |当前目录绝对路径字符串 %DATE% |和DATE命令同样的格式扩展到当前日期 %TIME% |和TIME命令同样的格式扩展到当前时间 %RANDOM% |0-32767之间任意十进制数 %ERRORLEVEL% |上一次调用命令或程序的返回值 %CMDEXTVERSION% |当前命令处理扩展版本号 %CMDCMDLINE% |调用命令处理器的原始命令行 %HIGHESTNUMANODENUMBER% |扩展到此计算机上的最高NUMA节点号
4.if命令
<用法1> if [not] errorlevel number command
errorlevel是上一次调用命令或程序的返回值,如果它大于或等于后面的跟着的数字(number),则执行后面的命令(command),否则不执行。if后面如果加了not,反之
<用法2> if [not] string1==string2 command
如果指定的文字字符串(string1和string2)匹配,执行后面的命令(command),否则不执行。if后面加了not,反之
<用法3> if [not] exist filename command
如果指定的文件(filename)存在,则执行后面的命令(command),否则不执行。if后面加了not,反之
if后面可以加else子句,用法为:if (command1) else (command2)
两个命令(command1和command2),最好加在括号里,防止像echo那样打印后面所有的字符串,if和else必须在同一行
if的另外3个用法:
<用法4> if [/I] [not] string1 compare-op string2 command
/I 意为要进行的字符串比较不分大小写
在对两个字符串进行比较时,可以使用下面6种不同的比较运算符(compare-op):
EQU 等于;NEQ 不等于;LSS 小于;LEQ 小于或等于;GTR 大于;GER 大于或等于
表达式“string1 compare-op string2”为真时执行后面的命令(command),否则不执行。if后面加了not,反之,注意not要加在“/I”的后面
<用法5> if [not] cmdextversion number command
这个用法的逻辑和上面<用法1>差不多,在cmdextversion大于或等于后面数字时返回真,cmdextversion是命令扩展有关联的内部版本号,第一个版本是1,每次对命令扩展有大的增强时,版本号会自增1,停用命令扩展时,cmdextversion为0
<用法6> if [not] defined variable command
如果一个环境变量被定义,则执行command。if后面加了not,反之
5.重定向符号
1)>表示以覆盖方式重定向提示信息,如果目的地原来有内容,将把原来的内容清除掉,用新内容填充。
2)>>表示以追加的方式重定向提示信息,如果目的地原来有内容,原有的内容将保持不变,在原有内容之后追加新内容。
3)nul表示空设备,任何输出重定向到空设备后,就看不到了
4)0代表标准输入(stdin),1代表标准输出(stdout),2代表标准错误(stderr)
5)这些设备号间可用>或>>进行重定向:1>&2、2>&1,后面的设备前要加“&”(句柄号)
6.exit命令
<用法> exit [/B] [exitcode]
/B 指定要退出当前批处理脚本而不是cmd.exe,如果从一个批处理脚本外执行,则会退出cmd.exe
exitcode 指定一个数字号码,如果指定了/B,就将errorlevel设成exitcode。如果退出cmd.exe,这个数字会作为过程的返回值
7.注释(::)与不显示命令(At符号)
如果某行以“::”开头,说明该行是注释行
如果某命令以“At符号”开头,说明这个命令本身不会显示在控制台上 注:At符号即@
8.for命令
for命令用于对一组文件中的每一个文件执行某个特定命令
<用法1> for %variable in (set) do command [command-parameters]
1)%variable 指定一个但以字母可替换的参数,在批处理程序中使用for命令,指定变量要使用%%variable,而不是%variable
2)(set) 指定一个或一组文件,可以使用通配符
3)command 指定对每个文件执行的命令,command-parameters是这个命令接收的参数
4)变量名称区分大小写
for命令还有以下几种用法:
<用法2> for /D %variable in (set) do command [command-parameters]
只搜索文件夹,不搜索文件。只搜索指定目录,不搜索子目录。
<用法3> for /R [[drive:]path]] %variable in (set) do command [command-parameters]
检查以[[drive:]path]]为根的目录树,指向每个目录中的for语句。如果/R后没有指定目录,则使用当前目录,如果set仅为一个半角句号(.),则枚举该目录树
<用法4> for /L %variable in (start,step,end) do command [command-parameters]
set变为以增量形式从开始到结束的一个数字序列
<用法5>
1)FOR /F ["options"] %variable IN (fileset) DO command [command-parameters]
fileset为一个或多个文件名,在遍历时每个文件都被打开、读取并经过处理。这里的处理指:读取文件并将其分成一行行的文字,然后将每行解析成0或更多的符号。最后用已找到的符号字符串变量调用for循环
2)FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
3)FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
/F 中的options参数
1)eol=c 指一个行注释字符的结尾(就1个)
2)skip=n 指在文件开始时忽略的行数
3)delims=xxx 值分割符集
4)tokens=x,y,m-n 指每行的哪一个符号被传递到每个迭代的for本身,这会导致额外变量名称的分配
5)m-n格式为一个范围,通过第n个符号制定第m个符号,如果符号字符串中最后一个字符是星号,那么在最后一个符号解析之后将为之分配额外的变量并接收行的保留文本
6)在有usebackq的情况下:
◆如果 (set) 是文件,可以有空格,则可以用英文引号引起来,当然,没有空格时,也可以不引
◆如果 (set) 是字符串,则需要用英文单引号将其引起来
◆如果 (set) 为命令,则需要用英文后引号将其括起来
END