下面的bat脚本是 g++编译当前文件夹中的*.cpp文件
@echo off
setlocal enabledelayedexpansion %扩展本地环境变量延迟%
for %%i in (*.cpp) do (
set var=%%i
echo compiling %%i ~~~~
g++ %%i -o !var:~0,-4! -std=c++11
)
在命令行中查看帮助 command /? 例如: for /? , set /? , mkdir /?
(1)自定义变量
@echo off
set myname=okbase.net
set myage=3
echo %myname% is about %myage% years old
pause
结果:alice is about 3 years old
关键是set命令的使用,set var=变量值,var是变量的名称,当需要在其它地方使用这个变量时,需要用两个%括起来,如%var%
(2)变量的算术运算
在进行算术运算时,我们需要给set命令加上 /a 参数,后面再跟表达式。
例如:
set var=100
set /a var=200+10
set /a var+=15
echo %var%
运行结果为225
这里的var+=15 相当于 var=%var%+15
(3)变量的逻辑运算与取余运算
需要将运算符用双引号表示出来:
set /a var=3 "&"7
set /a var=2 "^"6
set /a var=2 "<<"3
set /a var=256 ">>"2
set /a var=83 "%"10
批处理支持的运算符按优先权顺序:
表达式分隔符的作用是在一行中写多个表达式,例如:
例1:
@echo off
set a=4
set a=5 & echo %a%
pause
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
结果:5两个%%引起来的部分作为注释,变量也用%%引起来,若echo %var%,其中var没有定义,则输出“ECHO 处于关闭状态。”若启用了变量延时,则 !! 与%% 等价,没有启用延时,则 !! 无效
@echo off
setlocal enabledelayedexpansion
set str=123456789
echo 第一个字符为:%str:~0,1%
echo 头两个字符为:%str:~0,2%
echo 头5个字符为:%str:~0,5%
echo 去掉最后一个字符后的字符串为:%str:~0,-1%
echo 去掉最后3个字符后的字符串为:%str:~0,-3%
echo 第4个字符为:%str:~3,1%
echo 第4个及其之后的3个字符为:%str:~3,4%
echo 最后一个字符为:%str:~-1%
echo 最后一个字符为:%str:~-1,1%
echo 倒数第4个字符为:%str:~-4,1%
echo 倒数第4个及其之后的2个字符为:%str:~-4,3%
echo 倒数第4个及其之后的字符为:%str:~-4%
%注释若启用了变量延时,用叹号引起来变量与用百分号一起来等价 %
echo 倒数第4个及其之后的2个字符为:!str:~-4,3!
echo 倒数第4个及其之后的字符为:!str:~-4!
pause
(5)for语句的用法 (dos自带的帮助文档:for /?)
格式:FOR [参数] %%变量名 IN (相关文件或命令) DO 执行的命令
注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r
1,无参数
格式:FOR %%variable IN (set) DO command
打印当前目录所有的 .txt 文件: for %%i in (*.txt) do echo %%i
2,参数 “/d” (显示当前目录下的目录名字)
格式:FOR /D %variable IN (set) DO command [command-parameters]
3,参数 “/r” (r:递归搜索,搜索指定路径及所有子目录中与set相符合的所有文件)
格式:FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。
例:for /r d:/ %%i in (*.exe) do echo %%i --把D盘根目录,和每个目录的子目录下面全部的exe文件都列出来
4,参数 “/l” (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)