1.关于@、echo on、echo off
@:不显示此符号后面的命令
echo on:如果加了此句,那以脚本下面的所有都会显示命令本身(很明显体验不好),默认是echo on
echo off:关闭回显,加了此句后,执行脚本时那么都不会显示命令本身
@ echo off:不显示“echo off”本身,也不显示脚本下面的命令本身
对应的命令分别为:
@echo on echo "good" pause
@echo off echo "good" pause
echo off echo "good" pause
其它使用技巧:echo.输入一个空行
2.注释符号
::和rem都能起来注释作用
:后面加字母或数字被识作标号,和goto语句一起使用
:后面加其它的被识作注释,因此 :$也可以当作注释呢
还有另一个差别呢,如果打开了回显(echo on ),“rem 这是一个注释”会被显示出来,可“::注释”还是不会被显示出来
3.errorlevel
程序返回码
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为0,一般命令执行出错会设 errorlevel 为1
4.变量
脚本中指定变量:
@echo off set var=我是值 echo %var% pause
由用户自己输入变量的话,需要在set 后面加上参数/p,如下:
@echo off
set /p var=请输入:
echo %var%
pause
运行结果对比如下:
备注:set 后面还有另一个重要的参数set /a,让SET可以支持数学符号进行加减等一些数学运算,例如: set /a var=2 * 2 乘法运算
5.goto和:
goto就是跳转的意思,跳转到:指定处,如下
@echo off :start set /a var+=1 echo %var% if %var% leq 3 GOTO start pause
上面会依次打印1 2 3 4
6.find 在文件中搜索字符串
find "string" :显示包含字符串的行
find /v "string":剔除包含字符串的行
find /c "string":显示文件行数
find的用法有两种
type 文件路径 |find "string"
find "string" 文件路径
举例如下:
@echo off echo 111 >test.txt echo 222 >>test.txt type test.txt|find "111" del test.txt pause
@echo off echo 111 >test.txt echo 222 >>test.txt find "111" test.txt del test.txt pause
7.start批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
第一个命令会打开D盘,第二个命令会调用当前目录下的另一个bat脚本
8.pushd 和 popd
@echo off rem 在C盘建立mp3文件夹 md c:\mp3 rem 在D盘建立mp4文件夹 md d:\mp4 rem 切换当前目录为d:\mp4 cd /d d:\mp4 rem 保存先前的目录并切换到c:\mp3 pushd c:\mp3 rem 切换回d:\mp4目录 popd
备注:打印当前目录echo %cd%
9.if命令
(1) IF [NOT] ERRORLEVEL number command
IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。
Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
@echo off dir c: rem 退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行 IF ERRORLEVEL 1 goto 1 IF ERRORLEVEL 0 goto 0 Rem 上面的两行不可交换位置,否则失败了也显示成功。 :0 echo 命令执行成功! Rem 程序执行完毕跳至标题exit处退出 goto exit :1 echo 命令执行失败! Rem 程序执行完毕跳至标题exit处退出 goto exit :exit pause 运行显示:命令执行成功
(2)
IF [NOT] string1==string2 commd
(3)if [not] exits filename commd
echo off IF EXIST autoexec.bat echo 文件存在! IF not EXIST autoexec.bat echo 文件不存在 pause
10.for命令
它有4个参数,分别为/d、 /l、 /r、 /f
基本语法:FOR %%variable IN (set) DO command [command-parameters]
1)FOR /d %%variable IN (set) DO command [command-parameters]
/d 这个参数主要用于目录搜索,不会搜索文件
@echo off for /d %%i in (c:\*) do echo %%i pause
运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
@echo off for /d %%i in (???) do echo %%i pause
2)FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
*set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
*相反,如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。
@echo off for /r c:\ %%i in (*.exe) do echo %%i pause
咱们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!如果/r后面不加目录,则默认为当前目录
@echo off for /r c:\ %%i in (boot.ini) do echo %%i pause
运行本例发现枚举了c盘所有目录
为了只列举boot.ini存在的目录,可改成下面这样:
@echo off for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i pause
3)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)。
@echo off for /l %%i in (1,1,5) do @echo %%i pause
4)FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
options为关键字,共有4个,分别为eol=c、 skip=n 、delims=xxx 、tokens=x,y,m-n 、usebackq
举个例子
@echo off rem 首先建立临时文件test.txt echo ;注释行,这是临时文件,用完删除 >test.txt echo 11段 12段 13段 14段 15段 16段 >>test.txt echo 21段,22段,23段,24段,25段,26段 >>test.txt echo 31段-32段-33段-34段-35段-36段 >>test.txt FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k Pause Del test.txt
运行结果:
为什么会这样?我来解释:
eol=; 分号开头的行为注释行
tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后
11.时间延时
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
1)利用ping命令延时
@echo off echo 延时前:%time% ping /n 3 127.0.0.1 >nul echo 延时后:%time% pause
解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1),“>nul”就是屏蔽掉ping命令所显示的内容。
2)利用for命令延时
@echo off echo 延时前:%time% for /l %%i in (1,1,5000) do echo %%i>nul echo 延时后:%time% pause
解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的
12.子程序
在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面
子程序调用格式:
CALL :label arguments
子程序语法:
:label
command1
command2
......
commandn
goto :eof
在子程序段中,参数%0指标签:label
子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量
@echo off call :sub return echo 子程序返回值:%return% pause goto :eof :sub set %1=你好 goto :eof
运行结果:你好
@echo off set sum=0 call :sub 10 20 35 40 50 echo 数据求和结果:%sum% pause goto :eof :sub rem 参数1为返回变量名称 set /a sum+=%1 shift /1 if not "%1"=="" goto sub goto :eof
运行结果:155
shift /1表示从第二个参数开始移位
13.循环语句
又回到for命令了
1)指定次数循环
组合命令:
FOR /L %variable IN (start,step,end) DO (
Command1
Command2
……
)
2)对某集合执行循环语句。
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)
3)条件循环
利用goto语句和条件判断,dos可以实现条件循环
@echo off set var=0 rem ************循环开始了 :continue set /a var+=1 echo 第%var%次循环 if %var% lss 100 goto continue rem ************循环结束了 echo 循环执行完毕 pause
@echo off set var=100 rem ************循环开始了 :continue echo 第%var%次循环 set /a var-=1 if %var% gtr 0 goto continue rem ************循环结束了 echo 循环执行完毕 pause
14.批处理比较数值大小
equ - 等于
neq - 不等于
lss - 小于
leq - 小于或等于
gtr- 大于
geq - 大于或等于
15.|| 组合命令
语法:第一条命令 || 第二条命令 [|| 第三条命令...]
用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
16.& 组合命令
语法:第一条命令 & 第二条命令 [& 第三条命令...]
&、&&、||为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。
这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。
这里&两边的命令是顺序执行的,从前往后执行。
比如:
dir z:\ & dir y:\ & dir c:\
以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在
17、&& 组合命令
语法:第一条命令 && 第二条命令 [&& 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令
这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行
dir z:\ && dir y:\ && dir c:\
18、^ 转义字符
^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如
echo test ^>1.txt
结果则是:test > 1.txt
他没有追加在1.txt里,呵呵。只是显示了出来
另外,此转义字符还可以用作续行符号。
@echo off echo 英雄^ 是^ 好^ 男人 pause
19、| 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用
20、>> 、>重定向符
输出重定向命令
这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖
21、% 批处理变量引导符
这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。
引用变量用%var%,调用程序外部参数用%1至%9等等
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令行传递给批处理的参数
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
例:最简单的复制文件自身的方法
copy %0 d:\wind.bat
小技巧:添加行内注释
%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。
如何获取日期呢?
格式: %date%
结果: 2012-07-31
如何获取时间呢?
格式: %time%
结果: 10:21:21.68
这是获取的系统标准格式的日期和时间,但是有时候我们需要使用规定的格式,怎么办呢?
格式: %date:~x,y%以及%time:~x,y%
说明: x是开始位置,y是取得字符数
%time%代表时间如:现在的时间是19:12:16.26,3代表舍弃时间的前3个字符,就是舍弃19:,2代表取舍弃以后的前2个字符,就是12
set h=%time:~0,2%
比如说我要获取完整的日期和时间,
格式: %date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
结果: 20120731111039
但是如果时间早于10点,那么只显示日期不显示时间,如:20120731,如何解决呢?
格式: %date:~0,4%%date:~5,2%%date:~8,2%0%time:~1,1%%time:~3,2%%time:~6,2%
结果: 20120731052539
这样就达到我们的目标,成功的得到日期和时间了
23.title
设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了
23.随机数的问题
@echo off setlocal enabledelayedexpansion for /l %%i in (1,1,5) do ( adb shell monkey -p com.android.settings -s !RANDOM! --throttle 10 -v -v -v 100>monkeylog.txt echo !RANDOM! )
一定要用setlocal enabledelayedexpansion来启用延迟环境变量扩展,然后用!符号而不是%符号来访问环境变量,否则for循环里可能会产生一样的随机数,或者有其它问题。
24.monkey批处理
@echo off echo 等待设备连接... adb wait-for-devices echo 设备已连接成功,开始monkey测试... rem 获取当前时间为log文件夹名称 set time_c=%time:~0,2% if %time_c% lss 10 set time_c=0%time:~0,1% set logfilename=%date:~0,4%%date:~5,2%%date:~8,2%%time_c%%time:~3,2%%time:~6,2%_monkeylog if not exist E:\%logfilename% md E:\%logfilename% :begin set /p var=请键入你要测试的应用,按回车键输入下个,完成输入请按“q”: if not "%var%"=="q" echo %var% >>E:\%logfilename%\whitelist.txt if not "%var%"=="q" goto begin if "%var%"=="q" goto end :end adb push E:\%logfilename%\whitelist.txt /data/local/tmp/ for /l %%i in (1,1,5) do ( for /f "tokens=1 delims= " %%i in (E:\%logfilename%\whitelist.txt) do adb shell am force-stop %%i echo 第%%i次monkey测试 setlocal enabledelayedexpansion adb shell monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt -s !RANDOM! --throttle 300 --ignore-crashes --ignore-timeouts -v-v-v 10000 >>E:\%logfilename%\monkey_%%i.log) ping -n 3 127.0.0.1>nul ) echo 已完成测试,log存放在E盘以当前时间命名的文件夹中 pause
25. fsutil file createnew 1.txt 1024 创建指定大小的文件