第七课 DOS批处理编程高级技巧.docx
《第七课 DOS批处理编程高级技巧.docx》由会员分享,可在线阅读,更多相关《第七课 DOS批处理编程高级技巧.docx(24页珍藏版)》请在冰豆网上搜索。
第七课DOS批处理编程高级技巧
第七章DOS批处理编程高级技巧
∙
DOS批处理高级教程:
第一章批处理基础
∙DOS批处理高级教程:
第二章DOS循环for命令详解
∙DOS批处理高级教程:
第三章for命令中的变量
∙DOS批处理高级教程:
第四章批处理中的变量
∙DOS批处理高级教程:
第五章set命令详解
∙DOS批处理高级教程:
第六章if命令讲解
∙DOS批处理高级教程:
第七章DOS批处理编程高级技巧
一、交互界面设计
没啥说的,看看高手设计的菜单界面吧:
1.@echooff
2.cls
3.title终极多功能修复
4.:
menu
5.cls
6.color0A
7.echo.
8.echo ==============================
9.echo 请选择要进行的操作,然后按回车
10.echo ==============================
11.echo.
12.echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
13.echo.
14.echo 2.病毒专杀工具,端口关闭工具,关闭自动播放
15.echo.
16.echo 3.清除所有多余的自启动项目,修复系统错误
17.echo.
18.echo 4.清理系统垃圾,提高启动速度
19.echo.
20.echo Q.退出
21.echo.
22.echo.
23.:
cho
24.setchoice=
25.set/pchoice= 请选择:
26.IFNOT"%choice%"==""SETchoice=%choice:
~0,1%
27.if/i"%choice%"=="1"gotoip
28.if/i"%choice%"=="2"gotosetsave
29.if/i"%choice%"=="3"gotokaiji
30.if/i"%choice%"=="4"gotoclean
31.if/i"%choice%"=="Q"gotoendd
32.echo选择无效,请重新输入
33.echo.
34.gotocho
复制代码
只要学完本教程前面的章节,上面的程序应该能看懂了。
二、if…else…条件语句
前面已经谈到,DOS条件语句主要有以下形式
IF[NOT]ERRORLEVELnumbercommand
IF[NOT]string1==string2command
IF[NOT]EXISTfilenamecommand
增强用法:
IF[/I]string1compare-opstring2command
增强用法中加上/I就不区分大小写了!
增强用法中还有一些用来判断数字的符号:
EQU-等于
NEQ-不等于
LSS-小于
LEQ-小于或等于
GTR-大于
GEQ-大于或等于
上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。
例如:
IFEXISTfilename(
delfilename
)ELSE(
echofilenamemissing
)
也可写成:
ifexistfilename(delfilename)else(echofilenamemissing)
但这种写法不适合命令太多或嵌套命令的使用。
三、循环语句
1、指定次数循环
FOR/L%variableIN(start,step,end)DOcommand[command-parameters]
组合命令:
FOR/L%variableIN(start,step,end)DO(
Command1
Command2
……
)
2、对某集合执行循环语句。
FOR%%variableIN(set)DOcommand[command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。
可以使用通配符。
command 对每个文件执行的命令,可用小括号使用多条命令组合。
FOR/R[[drive:
]path]%variableIN(set)DOcommand[command-parameters]
检查以[drive:
]path为根的目录树,指向每个目录中的
FOR语句。
如果在/R后没有指定目录,则使用当前
目录。
如果集仅为一个单点(.)字符,则枚举该目录树。
同前面一样,command可以用括号来组合:
FOR/R[[drive:
]path]%variableIN(set)DO(
Command1
Command2
……
commandn
)
3、条件循环
上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。
利用goto语句和条件判断,dos可以实现条件循环,很简单啦,看例子:
例:
1.@echooff
2.setvar=0
3.rem************循环开始了
4.:
continue
5.set/avar+=1
6.echo第%var%次循环
7.if%var%lss100gotocontinue
8.rem************循环结束了
9.echo循环执行完毕
10.pause
复制代码
例:
1.@echooff
2.setvar=100
3.rem************循环开始了
4.:
continue
5.echo第%var%次循环
6.set/avar-=1
7.if%var%gtr0gotocontinue
8.rem************循环结束了
9.echo循环执行完毕
10.pause
复制代码
四、子程序
在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。
在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。
子程序调用格式:
CALL:
labelarguments
子程序语法:
:
label
command1
command2
......
commandn
goto:
eof
在子程序段中,参数%0指标签:
label
子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。
子程序例1:
1.@echooff
2.call:
subreturn你好
3.echo子程序返回值:
%return%
4.pause
5.
6.:
sub
7.set%1=%2
8.goto:
eof
复制代码
运行结果:
你好
子程序例2:
设计一个求多个整数相加的子程序
1.@echooff
2.setsum=0
3.call:
subsum102035
4.echo数据求和结果:
%sum%
5.pause
6.
7.:
sub
8.rem参数1为返回变量名称
9.set/a%1=%1+%2
10.shift/2
11.ifnot"%2"==""gotosub
12.goto:
eof
复制代码
运行结果:
65
在win98系统中,不支持上面这种标号调用,须将子程序单独保存为一个批处理程序,然后调用。
五、用ftp命令实现自动下载
ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。
这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。
其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。
ftp -n-s:
[[drive:
]path]filename
上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等
例:
open90.52.8.3 #打开ip
useriware #用户为iware
password8848 #密码
bin #二进制传输模式
prompt
cdtmp1 #切换至iware用户下的tmp1目录
pwd
lcdd:
\download #本地目录
mget* #下载tmp1目录下的所有文件
bye #退出ftp
六、用7-ZIP实现命令行压缩和解压功能
语法格式:
(详细情况见7-zip帮助文件,看得头晕可以跳过,用到再学)
7z[...][...]
7z.exe的每个命令都有不同的参数,请看帮助文件
为压缩包名称
为文件名称,支持通配符或文件列表
其中,7z是至命令行压缩解压程序7z.exe,是7z.exe包含的命令,列举如下:
a:
Addsfilestoarchive.添加至压缩包
a命令可用参数:
-i(Include)
-m(Method)
-p(SetPassword)
-r(Recurse)
-sfx(createSFX)
-si(useStdIn)
-so(useStdOut)
-ssw(Compresssharedfiles)
-t(Typeofarchive)
-u(Update)
-v(Volumes)
-w(WorkingDir)
-x(Exclude)
b:
Benchmark
d:
Deletesfilesfromarchive.从压缩包中删除文件
d命令可用参数:
-i(Include)
-m(Method)
-p(SetPassword)
-r(Recurse)
-u(Update)
-w(WorkingDir)
-x(Exclude)
e:
Extract解压文件至当前目录或指定目录
e命令可用参数:
-ai(Includearchives)
-an(Disableparsingofarchive_name)
-ao(Overwritemode)
-ax(Excludearchives)
-i(Include)
-o(SetOutputDirectory)
-p(SetPassword)
-r(Recurse)
-so(useStdOut)
-x(Exclude)
-y(AssumeYesonallqueries)
l:
Listscontentsofarchive.
t:
Test
u:
Update
x:
eXtractwithfullpaths用文件的完整路径解压至当前目录或指定目录
x命令可用参数:
-ai(Includearchives)
-an(Disableparsingofarchive_name)
-ao(Overwritemode)
-ax(Excludearchives)
-i(Include)
-o(SetOutputDirectory)
-p(SetPassword)
-r(Recurse)
-so(useStdOut)
-x(Exclude)
-y(AssumeYesonallqueries)
七、调用VBScript程序
使用Windows脚本宿主,可以在命令提示符下运行脚本。
CScript.exe提供了用于设置脚本属性的命令行开关。
用法:
CScript脚本名称[脚本选项...][脚本参数...]
选项:
//B 批模式:
不显示脚本错误及提示信息
//D 启用ActiveDebugging
//E:
engine 使用执行脚本的引擎
//H:
CScript将默认的脚本宿主改为CScript.exe
//H:
WScript将默认的脚本宿主改为WScript.exe(默认)
//I 交互模式(默认,与//B相对)
//Job:
xxxx 执行一个WSF工作
//Logo 显示徽标(默认)
//Nologo 不显示徽标:
执行时不显示标志
//S 为该用户保存当前命令行选项
//T:
nn 超时设定秒:
允许脚本运行的最长时间
//X 在调试器中执行脚本
//U 用Unicode表示来自控制台的重定向I/O
“脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:
\admin\vbscripts\chart.vbs。
“脚本选项和参数”将传递给脚本。
脚本参数前面有一个斜杠(/)。
每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。
如果未指定参数,则CScript将显示CScript语法和有效的宿主参数。
八、将批处理转化为可执行文件:
由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。
Bat2Com就可以完成这个转换工作。
小知识:
在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。
这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:
Bat2ComFileName,这样就会在同一目录下生成一个名为FileN的可执行文件,执行的效果和原来的.bat文件一样。
九、时间延迟
什么是时间延迟?
顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:
“模拟进度条”。
1、利用ping命令延时
例:
1.@echooff
2.echo延时前:
%time%
3.ping/n3127.0.0.1>nul
4.echo延时后:
%time%
5.pause
复制代码
解说:
用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。
本例中要发送3次请求到本机的ip(127.0.0.1)。
127.0.0.1可简写为127.1。
“>nul”就是屏蔽掉ping命令所显示的内容。
2、利用for命令延时
例:
1.@echooff
2.echo延时前:
%time%
3.for/l%%iin(1,1,5000)doecho%%i>nul
4.echo延时后:
%time%
5.pause
复制代码
解说:
原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。
3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内
例:
1.@echooff
2.echo%time%
3.call:
delay5000
4.echo%time%
5.pause
6.exit
7.
8.:
delay
9.echoWScript.Sleep%1>delay.vbs
10.CScript//Bdelay.vbs
11.deldelay.vbs
12.goto:
eof
复制代码
运行显示:
10:
44:
06.45
10:
44:
11.95
请按任意键继续...
上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。
误差在一秒之内。
4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内
仅用批处理命令就可以实现延迟操作。
例:
1.@echooff
2.set/pdelay=请输入需延迟的毫秒数:
3.setTotalTime=0
4.setNowTime=%time%
5.:
:
读取起始时间,时间格式为:
13:
01:
05.95
6.echo程序开始时间:
%NowTime%
7.:
delay_continue
8.set/aminute1=1%NowTime:
~3,2%-100
9.:
:
读取起始时间的分钟数
10.set/asecond1=1%NowTime:
~-5,2%%NowTime:
~-2%0-100000
11.:
:
将起始时间的秒数转为毫秒
12.setNowTime=%time%
13.set/aminute2=1%NowTime:
~3,2%-100
14.:
:
读取现在时间的分钟数
15.set/asecond2=1%NowTime:
~-5,2%%NowTime:
~-2%0-100000
16.:
:
将现在时间的秒数转为毫秒
17.set/aTotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
18.if%TotalTime%lss%delay%gotodelay_continue
19.echo程序结束时间:
%time%
20.echo设定延迟时间:
%delay%毫秒
21.echo实际延迟时间:
%TotalTime%毫秒
22.pause
复制代码
运行显示:
请输入需延迟的毫秒数:
6000
程序开始时间:
15:
32:
16.37
程序结束时间:
15:
32:
22.37
设定延迟时间:
6000毫秒
实际延迟时间:
6000毫秒
请按任意键继续...
实现原理:
首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。
误差:
windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。
当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?
因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。
为了方便引用,可将上面的例子改为子程序调用形式:
1.@echooff
2.echo程序开始时间:
%Time%
3.call:
delay10
4.echo实际延迟时间:
%totaltime%毫秒
5.echo程序结束时间:
%time%
6.pause
7.exit
8.
9.:
:
-----------以下为延时子程序--------------------
10.:
delay
11.@echooff
12.if"%1"==""goto:
eof
13.setDelayTime=%1
14.setTotalTime=0
15.setNowTime=%time%
16.:
:
读取起始时间,时间格式为:
13:
01:
05.95
17.:
delay_continue
18.set/aminute1=1%NowTime:
~3,2%-100
19.set/asecond1=1%NowTime:
~-5,2%%NowTime:
~-2%0-100000
20.setNowTime=%time%
21.set/aminute2=1%NowTime:
~3,2%-100
22.set/asecond2=1%NowTime:
~-5,2%%NowTime:
~-2%0-100000
23.set/aTotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
24.if%TotalTime%lss%DelayTime%gotodelay_continue
25.goto:
eof
复制代码
十、模拟进度条
下面给出一个模拟进度条的程序。
如果将它运用在你自己的程序中,可以使你的程序更漂亮。
1.@echooff
2.modeconcols=113lines=15&color9f
3.cls
4.echo.
5.echo 程序正在初始化...
6.echo.
7.echo ┌──────────────────────────────────────┐
8.set/p= ■9.for/L%%iin(1138)doset/pa=■nul
10.echo 100%%
11.echo └──────────────────────────────────────┘
12.pause
复制代码
解说:
“set/pa=■只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。
“ping/n0127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。
十一、特殊字符的输入及应用
开始->运行->输入cmd->edit->ctr