Windows batch文件学习笔记
运行程序
call
语法: call [ [Drive:] [Path] FileName [BatchParameters]][:label [arguments]]
参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。Filename 参数必须是.bat 或 .cmd 扩展名的类型文件。BatchParameters 指定批处理程序所需的命令行信息(即参数项)。
调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
call 命令接受用作跳转目标的标签。如果在脚本或批处理文件外使用call,它将不会在命令行起作用。
@echo off echo 示例1 echo start call call1.bat echo running call2 echo end pause @echo off echo 示例2 call :label echo 1 echo 2 :label echo 3 echo 4
start
call的时候,他们拥有同一个壳cmd.exe,在同一个进程当中,所以他们的变量是互通的。
start的时候,他们拥有两个壳cmd.exe,但child.bat可以看成是main.bat的子进程,子进程可以读取父进程中的变量
使用方式可在cmd中查看:start/?
start 和 call 的不同
总结结论:
对于start,概况二句话:“不同进程不能传值”,“相同进程单向传值,老子传儿子,非儿子传老子”。
对于call,“同一进程,变量互通”。
echo的使用
Echo :显示当前ECHO的状态:ECHO ON 或者ECHO OFF 。
ECHO ON :ECHO状态设为ON,将显示命令行(如每行前的C:>等类似标志)。
ECHO OFF:CHO状态设为OFF,将不显示命令行(如每行前的C:>等类似标志) 。
ECHO 字符串 :将输入的字符串显示在CMD屏幕上。
ECHO 字符串 &ECHO 字符串 … :&,类似and的意思,逻辑运算,用来显示多行数据。
ECHO 字符串 > 文件路径和文件名:将字符串写入文件中,若已有数据将先清空后写入。
ECHO 字符串 >> 文件路径和文件名 :将字符串写入文件中,若已有数据将追加到末尾。
注意每次:ECHO 字符串 >> 文件路径和文件名,命令之后,ECHO就回自动在在字符串后添加换行符,所以要想直接添加到文件末尾,那么文件中已有的数据,不能是ECHO命令先前输入的(或者手工删掉换行符)(ECHO 字符串 &ECHO 字符串…)>文件路径和文件名 :
将多行数据写入文件中(注意括号不能去掉,如果括号去掉的话,那么只能写入最后一个,前面的将输出在CMD窗口中。如果文件中已经有数据,将先自动清空后再写入。(ECHO 字符串 &ECHO 字符串…)>>路径和文件名
将多行数据写入文件中(注意括号不能去掉,如果括号去掉的话,那么只能写入最后一个,前面的将输出在CMD窗口中。如果文件中已经有数据,就将该字符串追加到文件的末尾。(ECHO 字符串)>>文件路径和文件名:在文件中另起一行追加上字符串。如图所示:
ECHO.:输出空行,即相当于输入一个回车
注意命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;+等任一符号替代。ECHO答复语|命令文件名:自动答复命令中的提问 ,不需要人为的输入
ECHO ^G :“^G”是用Ctrl+G敲入连体符号,输入多个^G可以产生多声鸣响。
@命令:echo off相象,但它是加在其它命令行的最前面,表示运行时不显示命令行本身。
rem 表示此命令后的字符为解释行,不执行,只是给自己今后查找用的。:: 也可以起到 rem 的注释作用, 而且更简洁有效
%命令
%表示参数,参数是指在运行批处理文件时在文件名后加的字符串。变量可以从 %0到%9,%0表示文件名本身,字符串用%1到%9顺序表示
~命令
用在 set /a 语句中时,它是一元运算符号,表示将操作数字按位取反,例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
用在for语句中,表示增强for的功能,能够提取到更多的信息。例如:在批处理文件的for语句中:
%%~i表示去掉第一对外侧引号,
%%~zi表示获取文件的大小(以字节为单位),
%%~ni表示获取文件名,
%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名
| 命令
一般而言,它以管道符号的身份出现,表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入,例如:echo abcd|findstr “b”,表示把echo abcd的执行结果,作为findstr “b” 的执行对象,也就是在字符串abcd中查找b字符;如果test.txt中有abcd字符串,则该语句与 findstr “b” test.txt 具有同样的效果;
set命令
设置变量
格式:set 变量名=变量值
详细:被设定的变量以%变量名%引用取消变量
格式:set 变量名=
详细:取消后的变量若被引用%变量名%将为空展示变量
格式:set 变量名
详细:展示以变量名开头的所有变量的值列出所有可用的变量
格式:set
计算器
格式:set /a 表达式
示例:set /a 1+2*3 输出 7设置变量为表达式计算后的值
set a=1+2
echo %a% ==>输出1+2
set /a a=1+2
echo %a% ==>输出3设置变量为用户输入的值
set /p a=输入一个值 ==>输出 输入一个值
echo %a% ==>显示用户输入的值替换变量值的内容
语法:set newVar=”oldVar:str1=str2%
将变量oldVar的值中的str1替换成str2,并将替换后的变量值赋给newVar.字符串截取
%Var:~start,len% 注意:从0开始。
%Var:~-len% 截取倒数len位
%Var:~0,-len% 截取从第一位开始,倒数第len位结束的值。
:、:: 命令
- 以:打头的单个的:表示该行是一个标签,它之后的内容是一个标签段,如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转到该标签段或用 call :test 调用该子过程;
- :: 而连续两个冒号打头表示该行内容为注释内容,实际上,:: 是个无效的标签名,:加上空格同样可以起到注释的作用,此时,::的功能和注释命令rem相同;但是,rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式
控制命令
if “参数” == “字符串” 待执行的命令
== 等于;EQU等于;NEQ不等于;LSS 小于;
EQ 小于或等于;GTR 大于;GEQ大于或等于if exist 文件名 待执行的命令
if errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。如if errorlevel 2 goto x2,DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码
FOR [%%cariable] in (集合) DO [命令]
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关参数:FOR有4个参数 /d /l /r /f
/d:FOR /D %%variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
如果 Set (也就是我上面写的 “相关文件或命令”) 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command
*号表示任意N个字符,而?号只表示任意一个字符
/R:FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。 递归
1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、相反,如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件
/L : FOR /L %%variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生 序列 (5 4 3 2 1)
目录切换
- CD [盘符][路径]:同一个分区的切换
- CD /d [盘符][路径]:不同分区的切换
- %cd%:显示当前的完整路径
常用命令命令
Del:删除文件
Copy:复制文件
Xcopy:复制文件夹
Md:创建文件夹
rd:删除文件夹
ren:重命名文件(夹)
move:移动文件(夹)
find:字符串查找
findstr:字符串查找增强,可以进行模式匹配搜索重定向符 >、>>
管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令:|、>、&&
重定向符, 意思是传递并且覆盖,它所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台,即命令提示符)。
重定向符将命令的输出结果追加到其后面的设备中去。这个符号的作用和>有点类似,但他们是有区别的 >>是
命令管道符 |
echo Y|rd /s c:\abc,通过管道命令|将echo y 的结果传给rd /s c:\abc 命令,从而达到自动输入y 的目的
转义字符 ^
要输出特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之类的格式来处理
组合命令 &、&&、||
&符号,允许同时执行多条命令,当第一个命令执行失败了,也不影响后边的命令执行。这里 & 两边的命令是顺序执行的,从前往后执行。
&&符号,允许同时执行多条命令,当碰到执行出错的命令后将不再执行后面的命令,如果一直没有出错则一直执行完所有命令。
||符号,正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令变量引导符 %
- 变量引用:当百分号成对出现,并且其间包含非特殊字符时,如%var%、%str%
- 形式参数的引用,%0 表示批处理文件本身,包括完整的路径和扩展名;%1至%9 表示第一个参数至第九个参数。
- set /a 语句,表示两数相除取余数。在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。
set /a num=4%%2,得到num为0而非2 - 转义符号:如果要显示%本身时,需要在前面用%来转义
界定符 “”
- 在表示带有空格或特殊符号的路径时常要用”“来将路径括起来。
- 表示其中的内容是一个完整的字符串。set “var=abc 123”
setlocal ENABLEDELAYEDEXPANSION (延迟环境变量扩展)
在我们启用了”延迟环境变量扩展”后,当CMD在解释涵有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进行匹配操作,这样我们的赋值操作就会完成.并且再”延迟环境变量扩展”启用后,CMD会用!号来判断这是不是一个变量,如没启用来变量 用%name%这样的格式判断,启用后就用!name!这样的格式判断了,这个符号我们需要注意!
@echo off set var=test for /l %%i in (1,1,5) do ( set var=%%i echo %var% ) ::会打印5个test了,说明for /l %%i in (1,1,5) 没有起作用
@echo off setlocal ENABLEDELAYEDEXPANSION set var=test for /l %%i in (1,1,5) do ( set var=%%i echo !var! ) ::会正常打印出1 2 3 4 5