文档视界 最新最全的文档下载
当前位置:文档视界 › DOS批处理高级教程精选合编(下)

DOS批处理高级教程精选合编(下)



DOS批处理高级教程精选合编(下)








第五章 set命令详解

很久没发贴了,今天来写点讲BAT的新手教学贴!

在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功能.



一、用set命令设置自定义变量

显示、设置或删除 cmd.exe 环境变量。
SET [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
要显示当前环境变量,键入不带参数的 SET。
SET 命令不允许变量名含有等号。

注意:以下用法将清除变量variable的值,使其变成未定义状态。
SET variable=
上面等号后面无任何符号,如果写成SET variable="",此时变量值并不为空,而是等于两个引号,即""


例子:
@echo off
set var=我是值
echo %var%
pause

请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!
set 是命令 var是变量名 =号右边的"我是值"是变量的值
在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%


SET还可以提供一个交互界面,让用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说SET的这种语法,只需要加一个"/P"参数就可以了!
SET /P variable=[promptString]


例子:
@echo off
set /p var=请输入变量的值:
echo 您输入了 %var% ~_~
pause

set /p 是命令语法 var是变量名 =号右边的"请输入变量的值: ",这个是提示语,不是变量的值了!
运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~

好了,先回顾到这,现在讲SET其他功能

使用set /?查看SET的帮助我们发现SET除了我上面讲的
SET [variable=[string]]
SET /P variable=[promptString]
这两种语法外,还有如下几种语法:
SET /A expression
环境变量替换已如下增强:
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%

这机种语法有什么用处呢?下面我们来一个个讲解他们!





二、用set命令进行简单计算

语法:SET /A expression
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
() -分组
! ~ - -一元运算符
* / % -算数运算符
+ - -算数运算符
<< >> -二进制逻辑移位
& -二进制按位“与”
^ -二进制按位“异”
| -二进制按位“或”
= *= /= %= += -= -算数赋值
&= ^= |= <<= >>= -二进制运算赋值
, -表达式分隔符

如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。
除十六进制有 0x 前缀,

八进制有 0 前缀的,数字值为十进位数字。
因此, 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混:
08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。

上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下:
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!

注意:一般的运算常为十进制运算,如果数字字符串最左边为0,将被认为是八进制,从而出错。比如,0812之类的数字不能参与十进制运算,转换方法为:10812-10000

例:
set aa=0812
set /a aa=1%aa%-10000
echo %aa%
结果为:812


例:
@echo off
set /p input=请输入计算表达式:
set /a var=%input%
echo 计算结果:%input%=%var%
pause

上面的例子是龙卷风设计的,很好用哟,请看下面几个运算过程:
注意:DOS计算只能进行整数运算,精确到整数

请输入计算表达式:1+9+20+30-10
计算结果:1+9+20+30-10=50
请按任意键继续. . .

请输入计算表达式:10/3 #除法只能精确到整数
计算结果:10/3=3
请按任意键继续. . .

请输入计算表达式:-100+62 #负数
计算结果:-100+62=-38
请按任意键继续. . .

请输入计算表达式:100%3 #求余数
计算结果:100%3=1
请按任意键继续. . .
注意:以上的求余数运算符%在批处理程序中必须写成%%


请输入计算表达式:(25+75)*2/(15+5) #括号
计算结果:(25+75)*2/(15+5)=10
请按任意键继续. . .


请输入计算表达式:1234567890*9876543210 #范围
无效数字。数字精确度限为 32 位。
计算结果:1234567890*9876543210=
请按任意键继续. . .

注意:上面的计算过程显示,DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。31个1换成十进制为2147483647,所以DOS计算的有效值范围是-2147483648至2147483647,超出该数值范围时计算出错,请看下面的计算过程:

请输入计算表达式:2147483647-1 #最大值减1,值有效
计算结果:2147483647-1=2147483646
请按任意键继续. . .

请输入计算表达式:2147483647+1 #最大值加1,出错,结果为最小值
计算结果:2147483647+1=-2147483648
请按任意键继续. . .

请输入计算表达式:-2147483648-1 #最小值减1,出错,结果为最大值
计算结果:-2147483648-1=2147483647
请按任意键继续. . .





运行set /a a=1+1,b=2+1,c=3+1后会显示一个4,但我们用
echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是表达式分隔符"逗"号的
作用!



有时候我们需要直接在原变量进行加减操作就可以用这种语法
set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1
都是一样的结

果,在原变量的值上在进行数学运算,不过这样写简单一点
再来一个:
set /a var*=2
其他都这么用,只要帮助里有这个语法!



另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的

比如我们在CMD里输入set /a var=1 & 1 "与运算",他并不会显示为1,而是报错,
为什么?对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^,看例子

set /a var= 1 "&" 1 这样结果就显示出来了,其他逻辑或取余操作符用法
set /a var= 1 "+" 1 异运算
set /a var= 1 "%" 1 取模运算
set /a var= 3 "<<" 2 左移位运算, 3的二进制为11,左移2位为1100,换成十进制就是12,自行验证
set /a var= 4 ">>" 2右移位运算,4的二进制为100,右移动2位为1,结果为1

龙卷风补充:凡是按位计算均需换算成二进制。

思考题:求2的n次方
参考答案:
@echo off
set /p n=请输入2的几次方:
set /a num=1^<^echo %num%
pause

运行结果:
请输入2的几次方: 3
8
请按任意键继续. . .

请输入2的几次方: 10
1024
请按任意键继续. . .

请输入2的几次方: 15
32768
请按任意键继续. . .


休息一下!

----------------------------
史前超文明谜团
----------------------------
奥克洛(Oklo)是非洲加蓬共和国一个铀矿的名字,法国有一些工厂使用从加蓬进口的铀矿石。1972年6月7日,法国科学家皮尔里特在用质谱计分析天然丰度的六氟化铀时,惊讶地发现,这批进口铀矿石已被人利用过了。因为这批铀矿石的含铀量相当低,铀矿石的一般含铀量为0.72%,而奥克洛铀矿石的含铀量却不足0.3%,和我们现有的核反应堆的废料几乎相同。
这件事引起了法国原子能委员会的高度重视。为此,许多科学家赶赴矿区进行考察研究。不久,奥克洛爆出了一条震惊世界的新闻:这里有一个古老的核反应堆,而且核反应堆的构成非常合理。法国政府宣布的这一发现,震惊了全世界。
这个核反应堆是由6个区域的大约500吨铀矿石组成,它的输出功率很低,只有10到100千瓦。据考证,该矿成矿年代大约在20亿年前,核反应堆在成矿后不久就开始运转,运转时间长达50万年之久,核反应所产生的废物,并没有扩散,而是局限在矿区周围。面对这个保存完整、结构合理的核反应堆,科学家们膛目结舌。
--------------
耐人寻味的疑问
--------------
是谁在20亿年前留下了这个古老的核反应堆?是外星人的作品,还是前一代地球文明的遗迹?20亿年前的反应堆又怎么来解释呢?这个铀矿到底是怎么回事呢?有人认为这是20亿年前的天外来客的杰作。他们乘坐宇宙飞船来到地球上,选择了奥克洛这个地方建造了原子

反应堆,以原子裂变或聚变所释放的能量为能源动力,为他们在地球上的活动提供能量。后来,他们离开了地球,返回了他们的“故里”,就在地球上留下了这座极古老而又神秘的原子反应堆。还有一种推断认为这是史前文明所留下的遗迹。也就是说,20亿年前,在今天我们叫做奥克洛的地方,可能存在着高度发达的文明,远远超过今天的人类文明。
————选自《世界未解之谜》




三、用set命令进行字符串处理


1、字符串替换

好了,符号说到这,现在说%PATH:str1=str2%
上面语法的意思就是:将字符串变量%PATH%中的str1替换为str2
这个是替换变量值的内容,看例子
@echo off
set a= bbs. verybat. cn
echo 替换前的值: "%a%"
set var=%a: =%
echo 替换后的值: "%var%"
pause

运行显示:(龙卷风添加)
替换前的值: " bbs. verybat. cn"
替换后的值: "https://www.docsj.com/doc/d89936779.html,"

对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现
%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换

比如我们把上面的例子改成这样
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
echo 替换前的值: "%a%"
set var=%a:.=伤脑筋%
echo 替换后的值: "%var%"
pause

运行显示:
替换前的值: "https://www.docsj.com/doc/d89936779.html,"
替换后的值: "bbs伤脑筋verybat伤脑筋cn"

解释set var=%a:.=伤脑筋%
set是命令 var是变量名 字a是要进行字符替换的变量的值,"."为要替换的值,
"伤脑筋"为替换后的值!
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"
这就是set的替换字符的很好的功能! 替换功能先讲到这,下面将字符串截取功能

请注意:字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令
例:
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
echo 替换前的值: "%a%"
echo 替换后的值: "%a:.=伤脑筋%"
pause
此例在echo语句中就替换了字符串,效果一样。


2、字符串截取

**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)


%PATH:~10,5% 这个什么意思,看例子:

截取功能例子1:
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
set var=%a:~1,2%
echo %var%
pause

执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为https://www.docsj.com/doc/d89936779.html,吗?
怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出
%PATH:~10,5%就是显示变量PATH里从11位(偏移量10)开始的5个字符!
分析set var=%a:~1,2%
set是命令,var

是变量值,a要进行字符操作的变量,"1"从变量"a"第几位开始显示,"2"表示显示几位。
合起来就是把变量a的值从第2位(偏移量1)开始,把2个字符赋予给变量var
这样应该明白了吧~

其他两种语法
%PATH:~-10%
%PATH:~0,-2%
他们也是显示指定变量指定几位的值的意思

%PATH:~-10% 看例子

截取功能例子2:
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
set var=%a:~-3%
echo %var%
pause
运行结果:.cn
这个就是把变量a倒数3位的值给变量VAR

当然我们也可以改成这样
截取功能例子3:
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
set var=%a:~3%
echo %var%
pause
运行显示:https://www.docsj.com/doc/d89936779.html,
这个就是把变量a的从第3位开始后面全部的值给变量VAR

%PATH:~0,-2% 例子

截取功能例子4:
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
set var=%a:~0,-3%
echo %var%
pause
执行后,我们发现显示的是"bbs.verybat",少了".cn"
从结果分析,很容易分析出,这是把变量a的值从0位开始,
到倒数第三位之间的值全部赋予给var

如果改成这样

截取功能例子5:
@echo off
set a=https://www.docsj.com/doc/d89936779.html,
set var=%a:~2,-3%
echo %var%
pause
运行显示:s.verybat
那么他就是显示从第3位(偏移量2)开始减去倒数三位字符的值,并赋予给变量var

讲得好,例子就是说明问题,为便于记忆,龙卷风小节如下:
a=https://www.docsj.com/doc/d89936779.html,
%a:~1,2% =“bs” 偏移量1,从第二位开始向右取2位
%a:~-3% =“.cn” 偏移量负3,即倒数3位(也可理解为留下右边3位),右取全部
%a:~3% =“https://www.docsj.com/doc/d89936779.html,” 偏移量3(也可理解为去掉左边3位),右取全部
%a:~0,-3% =“bbs.verybat” 偏移量0,右取长度至负3,即倒数3位
%a:~2,-3% =“s.verybat” 偏移量2,右取长度至负3,即倒数3位

**********************************************
所以,截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%a%为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
上面所述用法其实相当于vbs函数mid、left、right
%a:~0,n% 相当于函数left(a,n) 取左边n位
%a:~-m% 相当于函数right(a,m) 取右边m位
%a:~m,n% 相当于函数mid(a,m+1,n) 从m+1位开始取n位
%a:~m,-n% 相当于函数mid(a,m+1,len(a)-m-n),从m+1位开始,至倒数n+1位
%a:~m % 相当于函数mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),从m+1位开始取右边全部。

思考题目:输入任意字符串,求字符串的长度
参考答案:

@echo off
set /p str=请输入任意长度的字符串:
echo 你输入了字符串:"%str%"
call :stringlenth "%str%" num
echo 字符串长度为:%num%
pause
exit

:StringLenth
::---------字符串长度计算子程序
::---------参数%1为字符

串(如有空格,请用引号括起来)
::---------参数%2为返回变量名称,不能含空格或特殊字符
::@echo off
set theString=%~1
if not defined theString goto :eof
set Return=0
:StringLenth_continue
set /a Return+=1
set thestring=%thestring:~0,-1%
if defined thestring goto StringLenth_continue
if not "%2"=="" set %2=%Return%
goto :eof


好了set的一些用法,就介绍到这了,希望对各位有所帮助,时间不早睡觉Zz....

by 伤脑筋

休息休息!

诗曰:

混沌未分天地乱,茫茫渺渺无人见。
自从盘古破鸿蒙,开辟从兹清浊辨。
覆载群生仰至仁,发明万物皆成善。
欲知造化会元功,须看西游释厄传。

《西游记》是我国著名神话小说,是中华五千年文化的见证之一。唐僧乃大唐高僧玄奘法师,往印度求取佛经,致使中华佛家文化大放异彩。
唐僧:代表古代修行人对佛法的坚定执着之心。虽然唐僧手无缚鸡之力,但他不受金钱、美女、权利的诱惑,面对生死也不改变志向。这些都是古人所推崇的,所以唐僧是师父,其他人再有本事也只能当徒弟了。
悟空:“空”、“无”都是高层次的体现,故悟空本事最大。悟空的兵器为“定海神针”,寓意佛家的“定”。
悟能:层次不高,缺点也多,但有点本事。因其缺点多,故又名“八戒”。
悟净:层次不高,本事不大,仅仅有一个清净之心,故名“悟净”。但清净心也很重要,所以有几次悟空遇难时,乃悟净所救。






















第六章 if命令讲解

最近发现有些朋友一老问IF命令的用法,IF命令个人觉得很简单,所以就一直没把发放到新手教学贴里说,现在我给补上一文,希望对各位"非常BAT的"新手朋友们有所帮助.


现在开始:

在CMD使用IF /?打开IF的系统帮助(自己看我就不全部列出来了),我们会发现IF有3种基本的用法!
执行批处理程序中的条件处理。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

NOT 指定只有条件为 false 的情况下, Windows XP 才
应该执行该命令。

ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
指定数字的退出编码,指定条件为 true。

string1==string2 如果指定的文字字符串匹配,指定条件为 true。

EXIST filename 如果指定的文件名存在,指定条件为 true。

command 如果符合条件,指定要执行的命令。如果指定的
条件为 FALSE,命令后可跟一个执行 ELSE
关键字后的命令的 ELSE 命令。

ELSE

子句必须在 IF 之后出现在同一行上。例如:

IF EXIST filename (
del filename
) ELSE (
echo filename missing
)




第一种用法:IF [NOT] ERRORLEVEL number command

这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤.
一般上一条命令的执行结果代码只有两结果,"成功"用0表示 "失败"用1表示.

举个例子:
@echo off
net user
IF %ERRORLEVEL% == 0 echo net user 执行成功了!
pause

这是个简单判断上条命令是否执行成功.
细心的朋友可能会发现,这个用法和帮助里的用法不太一样,按照帮助里的写法"IF %ERRORLEVEL% == 0 echo net user 执行成功了! "这一句代码应该写成:IF ERRORLEVEL 0 echo net user 执行成功了!
那为什么我要写成这样呢?各位自己把代码改掉执行后,就会发现错误了!用这种语法,不管你的上面的命令是否执行成功,他都会认为命令成功了,不知道是BUG还是本人理解错误...

补充:这不是bug,而是 if errorlevel 语句的特点:当使用 if errorlevel 0 …… 的句式时,它的含义是:如果错误码的值大于或等于0的时候,将执行某个操作;当使用 if %errorlevel%==0 …… 的句式时,它的含义是:如果错误码的值等于0的时候,将执行某操作。因为这两种句式含义的差别,如果使用前一种句式的时候,错误码语句的排列顺序是从大到小排列

%ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! "成功"用0表示 "失败"用1表示. 当然还有其他参数,用的时候基本就这两数字.
一般上一条命令的执行结果代码只有两结果,"成功"用0表示 "失败"用1表示
这只是一般的情况,实际上,errorlevel返回值可以在0~255之间,比如,xcopy默认的errorlevel值就有5个,分别表示5种执行状态:

退出码 说明
0 文件复制没有错误。
1 if errorlevel 2 echo。
2 用户按 CTRL+C 终止了 xcopy。
4 出现了初始化错误。没有足够的内存或磁盘空间,或命令行上输入了无效的驱动器名称或语法。
5 出现了磁盘写入错误。

要判断上面xcopy命令的5种退出情况,应写成:
if errorlevel 5 echo出现了磁盘写入错误
if errorlevel 4 echo出现了初始化错误
if errorlevel 2 echo用户按 CTRL+C 终止了 xcopy
if errorlevel 1 echo if errorlevel 2 echo
if errorlevel 0 echo文件复制没有错误。
才能正确执行。

补充完毕。




再举几个例子给新手理解
@echo off
net usertest
IF %ERRORLEVEL% == 1 echo net user 执行失败了!
pause

这个是判断上一条命令是否执行失败的

@echo off
set /p var=随便输入个命令:
%var%
if %ERRORLEVEL% == 0 goto yes
goto no
:yes
echo !var! 执行成功了
pause
exit
:no
echo 基本上执行失败了..
pause

这个是根据你输入的命令,自动判断是

成功还是失败了!


在来一个简化版的
@echo off
set /p var=随便输入个命令:
%var%
if %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了!
pause

else后面写上执行失败后的操作!

当然我门还可以把if else这样的语句分成几行写出来,使他看上去好看点...
@echo off
set /p var=随便输入个命令:
%var%
if %ERRORLEVEL% == 0 (
echo !var! 执行成功了
) ELSE (
echo 基本上执行失败了..
)
pause


这里介绍的两种简写对IF的三种语法都可以套用,不单单是在IF [NOT] ERRORLEVEL number command
这种法上才能用






第二种用法:IF [NOT] string1==string2 command

这个呢就是用来比较变量或者字符的值是不是相等的.

例子
@echo off
set /p var=请输入第一个比较字符:
set /p var2=请输入第二个比较字符:
if %var% == %var2% (echo 我们相等) ELSE echo 我们不相等
pause

上面这个例子可以判断你输入的值是不是相等,但是你如果输入相同的字符,但是如果其中一个后面打了一个空格,
这个例子还是会认为相等,如何让有空格的输入不相等呢?我们在比较字符上加个双引号就可以了.
@echo off
set /p var=请输入第一个比较字符:
set /p var2=请输入第二个比较字符(多输入个空格试试):
if "%var%" == "%var2%" (echo 我们相等) ELSE echo 我们不相等
pause





第三种用法:IF [NOT] EXIST filename command

这个就是判断某个文件或者文件夹是否存在的语法

例子
@echo off
if exist "c:\test" (echo 存在文件) ELSE echo 不存在文件
pause

判断的文件路径加引号是为了防止路径有空格,如果路径有空格加个双引号就不会出现判断出错了!

这个语法没什么太多的用法,基本就这样了,就不多介绍了.

另外我们看到每条IF用法后都有个[NOT]语句,这啥意思?其他加上他的话,就表示先判断我们的条件不成立时,
没加他默认是先判断条件成立时,比如上面这个例子
@echo off
if not exist "c:\test" (echo 存在文件) ELSE echo 不存在文件
pause

加个NOT,执行后有什么结果,如果你的C盘下根本就没c:\test,他还是会显示"存在文件",这就表示了加了NOT就
会先判断条件失败!懂了吧,上面例子改成这样就正确了!
@echo off
if not exist "c:\test" (echo 不存在文件) ELSE echo 存在文件
pause






第四种用法:IF增强的用法

IF [/I] string1 compare-op string2 command #参数/I表示不区分大小写
IF CMDEXTVERSION number command
IF DEFINED variable command #判断变量是否存在,很有用

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它
是在跟与命令扩展名有关联的内部版本号比较。第一个版本
是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个。
命令扩展名被停用时,CM

DEXTVERSION 条件不是真的。

如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样
IF DEFINED variable command
IF NOT "variable"=="" command
上面两条命令效果一样。

用“set variable=”命令使变量variable变成未定义,即空值。

一句话,变量值为空,则为未定义;变量值不为空,则为已定义。
用语句IF DEFINED variable command判断变量是否存在时,请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。

例:
if defined aa (echo 变量aa存在) else (echo 变量aa不存在)
运行显示:变量aa不存在

例:
set aa=123
set aa=
if defined aa (echo 变量aa存在) else (echo 变量aa不存在)
运行显示:变量aa不存在


例:
@echo off
if a == A (echo 我们相等) ELSE echo 我们不相等
pause

执行后会显示:我们不相等

例:
@echo off
if /i a == A (echo 我们相等) ELSE echo 我们不相等
pause


加上/I不区分大小写就相等了!

最后面还有一些用来判断数字的符号

EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于

我就举一个例子,大家都懂数学...不讲多了
@echo off
set /p var=请输入一个数字:
if %var% LEQ 4 (echo 我小于等于4) ELSE echo 我不小于等于4
pause


BY 伤脑筋

----------------------------
难明其妙的水宫殿
----------------------------
土耳其首都伊斯坦布尔是座横跨欧亚的历史名城。来自欧亚非三大洲的各种文化在此交织碰撞,形成了各种文明奇迹,也留下了许多难解的谜题。在伊斯坦布尔郊外的埃列巴坦有座被当地人视为“恶魔之地”的宫殿,传说殿中藏有恶魔。人们从空旷阴森的大殿外走过,往往能听到里面奇怪的哗哗水声,格外玄秘恐怖,没有人敢去探个究竟。直到1920年,一对情侣才在好奇心的驱使下走进了大殿。他们刚刚踏入殿中,突然一声巨响,地下顿时大水汹涌。两人急忙转身逃出,发现大水已经高出门槛但却并不溢出。转眼之间,水又立即退下,无影无踪。两人鼓足勇气再次走进大殿,才发现这里竟是一座华丽无比的古罗马式厅堂,有高耸雪白的大理石柱、呼之欲出的美丽雕像、繁复优美的高雅壁画。
闻讯而来的考古学家们对宫殿进行了全面的勘查,发现它大约建于公元4世纪左右,有可能是东罗马帝国的君士坦丁大帝定都于此后的建筑。殿中的大水涨落极有规律,一昼夜涨落6次,每次都有准确的时间。更奇怪的是宫殿大门之下发现的一堆碎石,它似乎是控制着水涨水落的闸门。碎石底下是一排空心圆柱,似乎是引水管道。这座奇怪的建筑是干什么用的呢?有人说是罗马人的蓄水

池。那么它为什么要建得如此华丽,而且能够控制水位涨落呢?为什么大水高过门槛却漫不出来呢?它的工作原理又是什么?
————选自《世界未解之谜》




















第七章 DOS编程高级技巧


本章节乃龙卷风根据自己平时学用批处理的经验而总结的,不断补充中……。



一、交互界面设计

没啥说的,看看高手设计的菜单界面吧:
@echo off
cls
title 终极多功能修复
:menu
cls
color 0A
echo.
echo ==============================
echo 请选择要进行的操作,然后按回车
echo ==============================
echo.
echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
echo.
echo 2.病毒专杀工具,端口关闭工具,关闭自动播放
echo.
echo 3.清除所有多余的自启动项目,修复系统错误
echo.
echo 4.清理系统垃圾,提高启动速度
echo.
echo Q.退出
echo.
echo.
:cho
set choice=
set /p choice= 请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
if /i "%choice%"=="1" goto ip
if /i "%choice%"=="2" goto setsave
if /i "%choice%"=="3" goto kaiji
if /i "%choice%"=="4" goto clean
if /i "%choice%"=="Q" goto endd
echo 选择无效,请重新输入
echo.
goto cho
只要学完本教程前面的章节,上面的程序应该能看懂了。





二、if…else…条件语句

前面已经谈到,DOS条件语句主要有以下形式
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
增强用法:IF [/I] string1 compare-op string2 command
增强用法中加上/I就不区分大小写了!
增强用法中还有一些用来判断数字的符号:

EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于


上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。

例如:

IF EXIST filename (
del filename
) ELSE (
echo filename missing
)

也可写成:
if exist filename (del filename) else (echo filename missing)
但这种写法不适合命令太多或嵌套命令的使用。


----------------------------
水晶人头之谜
----------------------------
你可曾见到这样一颗水晶雕成的人头?它和真人头骨同等大小,用一整块水晶雕琢而成,牙齿十分整齐地排列在牙床上,鼻骨由3颗水晶石拼接起来,两只眼睛各为一块圆形水晶。人头的底部还藏着棱镜。它的模样估计是一个女人的头颅。整个水晶头骨上没有任何人工打磨的痕迹,看上去精美绝伦、熠熠生辉,即使用现代科技雕琢它也会十分耗时费工,可科学家却推断它早

在3600年前就已诞生,你相信有这样的事情吗?
这颗水晶头骨发现于中美洲的洪都拉斯,难道是印第安人的祖先制作出来的吗?可20世纪的印第安人还在美洲的丛林里过着衣不蔽体、食不果腹的原始生活,谁能相信他们的祖先早在几千年前就拥有了如此高超的雕刻技艺呢?我们知道,水晶的硬度非常之高,用一般的器具是很难对其加工的,那么古人是用什么工具雕刻它的呢?而且要找到这么大的水晶实在是不容易的事情啊。他们又如何能凭借原始的手工工具把它雕刻得如此成功?现在研究者还一致认为,当时的加工者并不了解水晶晶体的结构,他们也不具备现代的光学和人体骨骼构造的知识,在这样一种模糊的认识上能雕刻出这样的杰作,实在让人称奇!在古代玛雅的传说里,这颗水晶人头具有某种神奇的力量,他们通过它与神灵相通。
————选自《世界未解之谜》






三、循环语句

1、指定次数循环
FOR /L %variable IN (start,step,end) DO command [command-parameters]

组合命令:
FOR /L %variable IN (start,step,end) DO (
Command1
Command2
……
)

2、对某集合执行循环语句。
FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 对每个文件执行的命令,可用小括号使用多条命令组合。

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

检查以 [drive:]path 为根的目录树,指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。

同前面一样,command可以用括号来组合:
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)

3、条件循环
上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。
利用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





四、子程序

在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。

在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。

子程序调用格式:
CALL :label arguments

子程序语法:
:label
command1
command2
......
commandn
goto :eof

在子程序段中,参数%0指标签:label

子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。

子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。

传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。

子程序例1:
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause

:sub
set %1=%2
goto :eof
运行结果:你好



子程序例2:设计一个求多个整数相加的子程序
@echo off
set sum=0
call :sub sum 10 20 35
echo 数据求和结果:%sum%
pause

:sub
rem 参数1为返回变量名称
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof

运行结果:65


在win98系统中,不支持上面这种标号调用,须将子程序单独保存为一个批处理程序,然后调用。


----------------------------
进化论的空白之谜
----------------------------
古猿:生活于1400万~800万年前
南猿:生活于400万~190万年前
猿人:生活于170万~20万年前
在这三个阶段的两大衔接处,有几百万年的空白,科学家迄今没有发现此间的任何生物化石。
————选自《世界未解之谜》




五、用ftp命令实现自动下载

ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。
其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。

ftp -n -s:[[drive:]path]filename

上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等
例:
open 90.52.8.3 #打开ip
user iware #用户为iware
password8848 #密码
bin #二进制传输模式
prompt
cd tmp1 #切换至iware用户下的tmp1目录
pwd
lcd d:\download #本地目录
mget * #下载tmp1目录下的所有文件
bye #退出ftp




六、用7-ZIP实现命令行压缩和解压功能

语法格式:(详细情况见7-zip帮助文件,看得头晕可以跳过,用到再学)
7z [...] [...]

7z.exe的每个命令都有不同的参数,请看帮助文件
为压缩包名称
为文件名称,支持通配符或文件列表


其中,7z是至命令行压缩解压程序7z.exe,是7z.exe包含的命令,列举如下:

a: Adds files to archive. 添加至压缩包
a命令可用参数:
-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-sfx (create SFX)
-si (use StdIn)
-so (use StdOut)
-ssw (Compress shared files)
-t (Type of archive)
-u (Update)
-v (Volumes)
-w (Working Dir)
-x (Exclude)

b: Benchmark

d: Deletes files from archive. 从压缩包中删除文件
d命令可用参数:
-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-u (Update)
-w (Working Dir)
-x (Exclude)

e: Extract解压文件至当前目录或指定目录
e命令可用参数:
-ai (Include archives)
-an (Disable parsing of archive_name)
-ao (Overwrite mode)
-ax (Exclude archives)
-i (Include)
-o (Set Output Directory)
-p (Set Password)
-r (Recurse)
-so (use StdOut)
-x (Exclude)
-y (Assume Yes on all queries)

l: Lists contents of archive.
t: Test
u: Update

x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录
x命令可用参数:
-ai (Include archives)
-an (Disable parsing of archive_name)
-ao (Overwrite mode)
-ax (Exclude archives)
-i (Include)
-o (Set Output Directory)
-p (Set Password)
-r (Recurse)
-so (use StdOut)
-x (Exclude)
-y (Assume Yes on all queries)




七、调用VBScript程序

使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。


用法:CScript 脚本名称 [脚本选项...] [脚本参数...]

选项:
//B 批模式:不显示脚本错误及提示信息
//D 启用 Active Debugging
//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执行的是https://www.docsj.com/doc/d89936779.html,,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。

这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com
FileName,这样就会在同一目录下生成一个名为https://www.docsj.com/doc/d89936779.html,的可执行文件,执行的效果和原来的.bat文件一样。

----------------------------
人体辉光之谜
----------------------------
现代科技发现了很多让人吃惊的现象,它能使人们相信很多在传说或者梦境里才有的事情。宗教油画上的小天使总是头顶光圈飞来飞去。可你相信吗?在我们每个人的身体表面其实都有一层肉眼所见不到的彩色光!天使拥有的还只是头顶的光圈,可我们拥有的是全身的辉光,这多神奇。只要通过特殊的手段,譬如凭借某种涂了特殊颜料的玻璃,我们就能亲眼见到自己身体周围的辉光。而科学家发明了一种特殊的高频电场照相技术,能把人体辉光的状况显示在彩色照片上,不仅能让我们一睹为快,还能永久收藏。这实在是一件有意思的事情。科学家的实验还发现人体辉光是处于变动之中的,人体不同部位辉光的颜色不一样,而且在人体的精神和身体状况有变动时,辉光的明暗、强弱和大小都会随之发生变化。
————选自《世界未解之谜》





九、时间延迟

本条参考引用[英雄]教程
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:“模拟进度条”。
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)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。

2、利用for命令延时
例:
@echo off
echo 延时前:%time%
for /l %%i in (1,1,5000) do echo %%i>nul
echo 延时后:%time%
pause
解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。

3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内

例:
@echo off
echo %time%
call :delay 5000
echo %time%
pause
exit

:delay
echo WScript.Sleep %1>delay.vbs
CScript //B delay.vbs
del de

lay.vbs
goto :eof

运行显示:
10:44:06.45
10:44:11.95
请按任意键继续. . .

上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。


4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内

仅用批处理命令就可以实现延迟操作。

例:

@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo 程序开始时间:%NowTime%
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
::读取起始时间的分钟数
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将起始时间的秒数转为毫秒
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
:: 读取现在时间的分钟数
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将现在时间的秒数转为毫秒
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %delay% goto delay_continue
echo 程序结束时间:%time%
echo 设定延迟时间:%delay%毫秒
echo 实际延迟时间:%TotalTime%毫秒
pause

运行显示:

请输入需延迟的毫秒数:6000
程序开始时间:15:32:16.37
程序结束时间:15:32:22.37
设定延迟时间:6000毫秒
实际延迟时间:6000毫秒
请按任意键继续. . .

实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

为了方便引用,可将上面的例子改为子程序调用形式:

@echo off
echo 程序开始时间:%Time%
call :delay 10
echo 实际延迟时间:%totaltime%毫秒
echo 程序结束时间:%time%
pause
exit

::-----------以下为延时子程序--------------------
:delay
@echo off
if "%1"=="" goto :eof
set DelayTime=%1
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %DelayTime% goto delay_continue
goto :eof






十、模拟进度条

下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。

@echo off
mode con cols=113 lines=15 &color 9f
cls
echo.
echo 程

序正在初始化. . .
echo.
echo ┌──────────────────────────────────────┐
set/p= ■for /L %%i in (1 1 38) do set /p a=■nul
echo 100%%
echo └──────────────────────────────────────┘
pause

解说:“set /p a=■nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。





十一、特殊字符的输入及应用

开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。

(如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)

以上是特殊字符的输入方法,选自[英雄]教程,很管用的。也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。

一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。
例:
C:>ECHO ^G>temp.txt
“^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。


特殊字符的应用也很有意思,这里仅举一例:退格键

退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。

利用退格键,可以设计闪烁文字效果



例:文字闪烁
@echo off
:start
set/p=床前明月光::显示文字,光标停于行尾
ping -n 0 127.0.0.1>nul
::设置延迟时间
set /p a=:: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。
set /p a= ::输出空格将之前输出的文字覆盖掉。
set /p a=::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。
::否则光标不能退到最左端。
goto start


例:输出唐诗一首,每行闪动多次
@echo off
setlocal enabledelayedexpansion

set str=床前明月光 疑是地上霜 举头望明月 低头思故乡
::定义字符串str
for %%i in (%str%) do (
rem 由于str中含有空格,则以空格为分隔符将str中的每一个部分依次赋给变量%%i。
set char=%%i
echo.
echo.
for /l %%j in (0,1,5) do (
set/p=!char:~%%j,1!rem 依次取出变量char中的每一个字符,并显示。
ping -n 0 127.0.0.1>nul
rem 设置输出每个字符的时间延迟。
)
call :hero %%i
)
pause>nul
exit

:hero
for /l %

%k in (1,1,10) do (
ping /n 0 127.0.0.1>nul
set /p a=set /p a= set /p a=ping /n 0 127.0.0.1>nul
set /p a=%1)
::文字闪动
goto :eof

----------------------------
神秘的瑜伽
----------------------------
印度的瑜伽术充满了神奇,很多人曾亲眼见识过瑜伽师的奇特本领。他们能够表演“千里问诊”、“外气治病”、“静会腾身”、“思维传递”等令人拍案称奇的功夫;更玄的是,有的瑜伽师还能控制自己心脏的跳动,这不能不令观者瞠目结舌。一位叫马哈里的瑜伽师就当众做过这种表演。在他运气静坐的时候,没有脉搏和心音。医生的心电图显示为一条直线!这真是让人难以相信。而另一位叫萨蒂雅鲁尔蒂的瑜伽师更是在众目睽睽之下被活埋了8昼夜。他在这期间没有进食,没有脉搏,没有呼吸,心电图也出现了直线,直到最后一天心电图才恢复成曲线。他出土的时候,全身僵硬,反应麻木,过了一段时间后才渐渐恢复正常。
科学家力图用科学知识对此做出合理解释。他们发现在瑜伽师静坐练功的时候,其人体代谢会降低,耗氧量会减少,肌体也能得到充分休息。而在表演心脏停止时,他们或者急剧提高腹压,减少心脏供血,而使其体积变小、活动减弱;或者是通过猛烈收缩胃部,使相应神经急剧紧张,而大大降低心脏活动。可这些都只能使瑜伽师能在一定程度上控制心脏活动,而他们居然能使心脏完全停止跳动,这是现代科学所无法解答的。
————选自《世界未解之谜》




十二、随机数(%random%)的应用技巧

%RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。

那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。

例:生成5个100以内的随机数
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1 1 5) do (
set /a randomNum=!random!%%100
echo 随机数:!randomNum!
)
pause
运行结果:(每次运行不一样)
随机数:91
随机数:67
随机数:58
随机数:26
随机数:20
请按任意键继续. . .

求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。

总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。


思考题目:生成给定位数的随机密码
解答思路:将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。

参考答案1:(简单)
@echo off
call :randomPassword 5 pass1 pass2

echo %pass1% %pass2%
pause
exit

:randomPassword
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------for命令最多只能区分31个字段
@echo off
set password_len=%1
if not defined password_len goto :eof
if %password_len% lss 1 goto :eof
set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z
set return=
set num=0
:randomPassword1
set /a num+=1
set /a numof=%random%%%26+1
for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i
if %num% lss %password_len% goto randomPassword1
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof





参考答案2:(最优)
@echo off
call :randomPassword 6 pass1 pass2 pass3
echo %pass1% %pass2% %pass3%
pause
exit

:randomPassword
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------goto循环、变量嵌套、命令嵌套
@echo off
if "%1"=="" goto :eof
if %1 lss 1 goto :eof
set password_len=%1
set return=
set wordset=abcdefghijklmnopqrstuvwxyz023456789_
::---------------------------循环
:randomPassword1
set /a numof=%random%%%36
call set return=%return%%%wordset:~%numof%,1%%
set /a password_len-=1
if %password_len% gtr 0 goto randomPassword1
::---------------------------循环
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof



说明:本例涉及到变量嵌套和命令嵌套的应用,见后。





十三、变量嵌套 与 命令嵌套

和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。

先复习一下前面的“字符串截取”的关键内容:

**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。

百分号如果需要当成单一字符,必须写成%%

以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

比如设变量word为“abcdefghij”,变量num为“123456789”
%word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行,那么,怎么实现这种变量嵌套呢?这就必须结合命令嵌套。

什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。

例:用call语

句实现命令嵌套
@echo off
set str1=aaa echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 运行命令字符串生成最终结果为:
call %str1:~4,7%
pause

运行显示:
初始字符串:aaa echo ok bbb
生成命令字符串如下:
echo ok
运行命令字符串生成最终结果为:
ok
请按任意键继续. .

相关文档
相关文档 最新文档