dos运行g++编译当前文件夹中的*.cpp文件(含dos用法)

下面的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
)

------------------------------------------------------------------

dos的用法

在命令行中查看帮助 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 
批处理支持的运算符按优先权顺序:
()                   - 分组
! ~ -                - 一元运算符
* / %                - 算数运算符
+ -                  - 算数运算符
<< >>                - 逻辑移位
&                    - 按位“与”
^                    - 按位“异”
|                    - 按位“或”
= *= /= %= += -=     - 复合赋值运算符
&= ^= |= <<= >>=     - 复合赋值运算符
,                    - 表达式分隔符

表达式分隔符的作用是在一行中写多个表达式,例如:

(4)变量的高级特性:变量延时

例1:

 @echo off
 set a=4
 set a=5 & echo %a%
 pause

结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
让我们先了解一下批处理运行命令的机制:
    批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在读取某行命令时,如果其中有变量,则变量值应该取 上一行的值。所以在读取命令“set a=5 & echo %a%”时,dos将其预处理为“set a=5 & echo 4”,然后执行。而其中的a=5所做的数值变更,只能在下一命令行才能体现了。
    为了能够及时感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而是边执行边赋值。

例2:

 @echo off
 setlocal enabledelayedexpansion
 set a=4
 set a=5 & echo !a!
 pause 
结果:5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是 "setlocal enabledelayedexpansion "

并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。

(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]  

  1.  for /d %%i in (c:/*) do echo %%i  --显示c盘根目录下的所有目录   
  2.  for /d %%i in (???) do echo %%i  --显示当前目录下名字只有1-3个字母的目录   

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)

  1. 格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]   
  2. 该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step   
  1.  示例:   
  2.   for /l %%i in (1,1,5) do @echo %%i  --输出1 2 3 4 5   
  3.   for /l %%i in (1,2,10) do @echo %%i  --输出1,3,5,7,9    
  4.   for /l %%i in (100,-20,1) do @echo %%i  --输出100,80,60,40,20   
  5.   for /l %%i in (1,1,5) do start cmd  --打开5个CMD窗口   
  6.   for /l %%i in (1,1,5) do md %%i  --建立从1~5共5个文件夹   
  7.   for /l %%i in (1,1,5) do rd /q %%i  --删除从1~5共5个文件夹   

你可能感兴趣的:(dos)