For循环语句详解.docx
《For循环语句详解.docx》由会员分享,可在线阅读,更多相关《For循环语句详解.docx(20页珍藏版)》请在冰豆网上搜索。
For循环语句详解
Hellobat-DOSBAT批处理编程入门教程
(一)
介绍:
DOS批处理真的是太古老了,伴随着DOS的诞生、成长,一直活跃在微软的操作系统中,曾经经历过完全依赖DOS的年代的朋友们一定不会忘记AUTOEXEC.BAT这个著名的批处理,即使是用Windows的今天,批处理也仍旧能帮我们做很多事情,继续发挥着余热。
本文以程序员的角度介绍BAT的使用,供大家参考,共同学习。
正文:
DOS批处理真的是太古老了,伴随着DOS的诞生、成长,一直活跃在微软的操作系统中,曾经经历过完全依赖DOS的年代的朋友们一定不会忘记AUTOEXEC.BAT这个著名的批处理,即使是用Windows的今天,批处理也仍旧能帮我们做很多事情,继续发挥着余热。
本文以程序员的角度介绍BAT的使用,供大家参考,共同学习。
一、创建批处理的方法
(1)用记事本
打开记事本,输入DOS命令,保存的时候在保存类型处选择“所有文件”,文件名处填写批处理名称,例如demo.bat。
(2)利用copycon命令
运行命令行(cmd或command),输入copycondemo.bat,
输入DOS命令,按Ctrl+Z完成保存并退出。
二、我的第一个BAT程序
DOS批处理真的是太古老了,伴随着DOS的诞生、成长,一直活跃在微软的操作系统中,曾经经历过完全依赖DOS的年代的朋友们一定不会忘记AUTOEXEC.BAT这个著名的批处理,即使是用Windows的今天,批处理也仍旧能帮我们做很多事情,继续发挥着余热。
本文以程序员的角度介绍BAT的使用,供大家参考,共同学习。
一、创建批处理的方法
(1)用记事本
打开记事本,输入DOS命令,保存的时候在保存类型处选择“所有文件”,文件名处填写批处理名称,例如demo.bat。
(2)利用copycon命令
运行命令行(cmd或command),输入copycondemo.bat,
输入DOS命令,按Ctrl+Z完成保存并退出。
二、我的第一个BAT程序
1
2
3
4
@echooff
cls
echoHellobat!
pause
首先解释一下echo命令,echo命令本身是用于显示字符,如上面的echoHellobat!
则会在屏幕上打上Hellobat!
一行字。
echooff命令表示此语句后的所有命令都不显示命令行本身,有点拗口不是吗?
举个刚才的例子吧,
如果没有echooff,则执行时屏幕显示:
1
2
3
4
5
C:
\DocumentsandSettings\Administrator\桌面>echoHellobat!
Hellobat!
C:
\DocumentsandSettings\Administrator\桌面>pause
请按任意键继续...
如果加了@echooff,则执行结果为:
1
2
Hellobat!
请按任意键继续...
@这个字符的作用是不显示本行的命令行,所以即不显示本行又不显示后续行命令,我们就用@echooff
pause命令会暂停批处理的执行并在屏幕上显示“请按任意键继续...”的提示,等待用户按任意键后继续。
另外,你可能拥有良好的编程习惯,在关键的地方写上注释,这个时候我们可以用Rem或:
:
符号,例如:
1
2
3
4
:
:
开始清除屏幕
cls
Rem开始输出
echoHellobat!
先到这里吧!
我在
变量-DOSBAT批处理编程入门教程
(二)
既然我们称之为批处理编程,那么变量是少不了的,在批处理中既可以自定义变量也可以使用系统变量,我们先来了解一下自定义变量。
(1)自定义变量
请看如下命令:
1
2
3
4
5
@echooff
setmyname=
setmyage=3
echo%myname%isabout%myage%yearsold
pause
运行结果:
isabout3yearsold
关键是set命令的使用,setvar=变量值,var是变量的名称,当需要在其它地方使用这个变量时,需要用两个%括起来,如%var%
(2)变量的算术运算
在进行算术运算时,我们需要给set命令加上/a参数,后面再跟表达式。
例如:
1
2
3
4
setvar=100
set/avar=200+10
set/avar+=15
echo%var%
运行结果为225
这里的var+=15相当于var=%var%+15
(3)变量的逻辑运算与取余运算
需要将运算符用双引号表示出来:
1
2
3
4
5
set/avar=3"&"7
set/avar=2"^"6
set/avar=2"<<"3
set/avar=256">>"2
set/avar=83"%"10
批处理支持的运算符按优先权顺序:
() -分组
!
~- -一元运算符
*/% -算数运算符
+- -算数运算符
<<>> -逻辑移位
& -按位“与”
^ -按位“异”
| -按位“或”
=*=/=%=+=-= -复合赋值运算符
&=^=|=<<=>>= -复合赋值运算符
-表达式分隔符
表达式分隔符的作用是在一行中写多个表达式,例如:
1
2
set/avar1=1,var2=8
echo%var1%%var2%
(4)获取键盘输入到变量
set命令有一个/p参数,可以帮助我们获得键盘输入:
1
2
set/pvar=-^>请选择:
echo您的选择是:
%var%
这在我们显示菜单供用户选择的时候是非常有用的,当加上/p参数,等号后面的内容就是用于显示的字符,并非给变量赋值。
系统变量-DOSBAT批处理编程入门教程(三)
系统变量实际是操作系统中的系统变量,我们在命令行中可以直接使用。
这些系统变量有些可以读写,有些是只读的。
下面我们列举一下系统变量及其意义以便使用时参考之用。
%ALLUSERSPROFILE% (本地)返回“所有用户”配置文件的位置。
%APPDATA% (本地)返回默认情况下应用程序存储数据的位置。
%CD%(本地)返回当前目录字符串。
%CMDCMDLINE%(本地)返回用来启动当前的Cmd.exe的准确命令行。
%CMDEXTVERSION%(系统)返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% (系统)返回计算机的名称。
%COMSPEC% (系统)返回命令行解释器可执行程序的准确路径。
%DATE% (系统)返回当前日期。
使用与date/t命令相同的格式。
由Cmd.exe生成。
有关date命令的详细信息,请参阅Date。
%ERRORLEVEL% (系统)返回上一条命令的错误代码。
通常用非零值表示错误。
%HOMEDRIVE% (系统)返回连接到用户主目录的本地工作站驱动器号。
基于主目录值而设置。
用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% (系统)返回用户主目录的完整路径。
基于主目录值而设置。
用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% (系统)返回用户的共享主目录的网络路径。
基于主目录值而设置。
用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER% (本地)返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% (系统)指定安装在计算机上的处理器的数目。
%OS% (系统)返回操作(系统)名称。
Windows2000显示其操作系统为Windows_NT。
%PATH%(系统)指定可执行文件的搜索路径。
%PATHEXT%(系统)返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% (系统)返回处理器的芯片体系结构。
值:
x86或IA64基于Itanium
%PROCESSOR_IDENTFIER%(系统)返回处理器说明。
%PROCESSOR_LEVEL% (系统)返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION%(系统)返回处理器的版本号。
%PROMPT%(本地)返回当前解释程序的命令提示符设置。
由Cmd.exe生成。
%RANDOM%(系统)返回0到32767之间的任意十进制数字。
由Cmd.exe生成。
%SYSTEMDRIVE%(系统)返回包含Windowsserveroperatingsystem根目录(即系统根目录)的驱动器。
%SYSTEMROOT% (系统)返回Windowsserveroperatingsystem根目录的位置。
%TEMP%和%TMP%(系统)和用户返回对当前登录用户可用的应用程序所使用的默认临时目录。
有些应用程序需要TEMP,而其他应用程序则需要TMP。
%TIME%(系统)返回当前时间。
使用与time/t命令相同的格式。
由Cmd.exe生成。
有关time命令的详细信息,请参阅Time。
%USERDOMAIN%(本地)返回包含用户帐户的域的名称。
%USERNAME%(本地)返回当前登录的用户的名称。
%USERPROFILE%(本地)返回当前用户的配置文件的位置。
%WINDIR%(系统)返回操作系统目录的位置。
在这些系统变量中,最常用的是目录相关的系统变量,例如:
1
2
3
4
5
6
7
8
:
:
将1.doc复制到Windows目录下
copy1.doc"%WINDIR%\"
:
:
将2.doc复制到TEMP目录下
copy2.doc"%TEMP%\"
:
:
将3.doc复制到当前账号的启动中
copy3.doc"%USERPROFILE%\「开始」菜单\程序\启动\"
程序流程控制基础-DOSBAT批处理编程入门教程(四)
批处理中的流程控制语句主要可以分为三类:
选择语句、循环语句和跳转语句。
在每种语句中都会执行一个检测,检测一个布尔型值,该布尔型值控制批处理的执行流程。
(1)选择语句ifelse
先看例子
1@echooff
2setvar=""
3if%var%==""setvar=10
4if%var%GEQ10echo值大于等于10
5pause
代码中,用if语句判断var变量的值,如果为空,则赋值10,然后第2条if语句判断var的值是
不是大于等于10并输出结果。
这里用到了比较运算符GEQ,其它还有许多比较运算符:
EQU-等于
NEQ-不等于
LSS-小于
LEQ-小于或等于
GTR-大于
GEQ-大于或等于
另外,我们可以用not将布尔值取反,例如:
1ifnot%var%LSS10echo值不小于10
再来看看使用else的例子:
1@echooff
2setvar=""
3if%var%==""setvar=10
4if%var%GTR10(echo值大于10)else(echo值小于等于10)
5pause
代码中,如果var大于10,输出“值大于10”,否则输出“值小于等于10”
另外,if有一个/i参数,表明忽略大小写,例如:
1setvar="aBc"
2if/i%var%=="abc"echoabc
(2)循环语句for
这里只简单介绍一下for配合/l参数的使用方法,更多使用方法请看下节。
格式是这样的:
FOR/L%variableIN(start,step,end)DOcommand[command-parameters]
先看例子:
1for/l%%iin(0,1,5)doecho%%i
运行结果输出:
012345
这条语句的意思是变量%%i从0到5,递增1循环
其中的start,step,end可以使用变量,例如:
1setbegin=5
2setend=1
3setstep=-1
4for/l%%iin(%begin%,%step%,%end%)doecho%%i
(3)跳转语句goto
goto语句的作用是跳转到指定标签段,首先我们需要定义标签段,例如:
:
exitdoor
需要跳转到exitdoor的地方只要gotoexitdoor即可,一般我们配合if来使用:
1@echooff
2set/pinput=请选择
(1)退出,
(2)继续:
3if%input%==1gotoexitdoor
4echo继续工作...
5pause
6exit
7
8:
exitdoor
9echo下班了!
10,pause
这个例子中从键盘获取输入,如果是1,则跳到exitdoor处,否则继续向下执行。
For循环语句详解-DOSBAT批处理编程入门教程(五)
格式:
FOR[参数]%%变量名IN(相关文件或命令) DO执行的命令
作用:
对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。
注意:
在批处理文件中使用FOR命令时,指定变量请使用%%variable,而不要用%variable。
变量名称是区分大小写的,所以%i不同于%I.
关于:
for命令可以带参数或不带参数,带参数时支持以下参数:
/d/l/r/f
下面分别解释一下
零:
无参数时:
FOR%variableIN(set)DOcommand[command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。
可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
示例:
for%%iin(t*.*)doecho%%i--显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)
for%%iin(d:
\mydocuments\*.doc)do@echo%%i--显示d:
\mydocuments\目录下与*.doc相匹配的文件
一、参数/d(参数只能显示当前目录下的目录名字)
格式:
FOR/D%variableIN(set)DOcommand[command-parameters]
这个参数主要用于目录搜索,不会搜索文件,/D参数只能显示当前目录下的目录名字。
(TTT特别说明:
只会搜索指定目录下的目录,不会搜索再下一级的目录。
)
示例:
for/d%%iin(c:
\*)doecho%%i --显示c盘根目录下的所有目录
for/d%%iin(?
?
?
)doecho%%i --显示当前目录下名字只有1-3个字母的目录
二、参数/R(搜索指定路径及所有子目录中与set相符合的所有文件)
格式:
FOR/R[[drive:
]path]%variableIN(set)DOcommand[command-parameters]
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
1、set中的文件名如果含有通配符(?
或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。
例:
for/rc:
\%%iin(*.exe)doecho%%i--把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!
!
!
!
示例:
for/rc:
\%%iin(boot.ini)doecho%%i--枚举了c盘所有目录
for/rd:
\backup%%iin
(1)doecho%%i --枚举d\backup目录
for/rc:
\%%iin(boot.ini)doifexist%%iecho%%i --很好的搜索命令,列举boot.ini存在的目录
三、参数/L(该集表示以增量形式从开始到结束的一个数字序列。
可以使用负的Step)
格式:
FOR/L%variableIN(start,step,end)DOcommand[command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
可以使用负的Step
示例:
for/l%%iin(1,1,5)do@echo%%i --输出12345
for/l%%iin(1,2,10)do@echo%%i --输出1,3,5,7,9
for/l%%iin(100,-20,1)do@echo%%i --输出100,80,60,40,20
for/l%%iin(1,1,5)dostartcmd --打开5个CMD窗口
for/l%%iin(1,1,5)domd%%i --建立从1~5共5个文件夹
for/l%%iin(1,1,5)dord/q%%i --删除从1~5共5个文件夹
四、参数/F
格式:
FOR/F["options"]%%iIN(file)DOcommand
FOR/F["options"]%%iIN("string")DOcommand
FOR/F["options"]%%iIN('command')DOcommand
这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。
file代表一个或多个文件
string代表字符串
command代表命令
["options"]可选
对于FOR/F%%iIN(file)DOcommand
file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行分成一个一个的元素,忽略空白的行,看个例子。
假如文件a.txt中有如下内容:
第1行第1列第1行第2列第1行第3列
第2行第1列第2行第2列第2行第3列
第3行第1列第3行第2列第3行第3列
你想显示a.txt中的内容,会用什么命令呢?
当然是type,typea.txt
for也可以完成同样的命令:
for/f%%iin(a.txt)doecho%%i
还是先从括号执行,因为含有参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,
{“第1行第1列第1行第2列第1行第3列”,rem第一个元素
“第2行第1列第2行第2列第2行第3列”,rem第二个元素
“第3行第1列第3行第2列第3行第3列”} rem第三个元素
集合中只有3个元素,同样用%%i依次代替每个元素,然后执行do后面的命令。
具体过程:
用%%i代替“第1行第1列第1行第2列第1行第3列”,执行do后面的echo%%i,显示“第1行第1列第1行第2列第1行第3列”,
用%%i代替“第2行第1列第2行第2列第2行第3列”,执行echo%%i,显示“第2行第1列第2行第2列第2行第3列”,
依次,直到每个元素都代替完为止。
为了加强理解/f的作用,请执行一下两个命令,对比即可明白:
for/f%%iin(a.txt)doecho%%irem这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中
的内容。
for%%iin(a.txt)doecho%%irem而这个只会显示a.txt这个名字,并不会读取其中的内容。
通过上面的学习,我们发现for/f会默认以每一行来作为一个元素,但是如果我们还想把每一行再分解更小的内容,该怎么办呢?
不用担心,for命令还为我们提供了更详细的参数,使我们将每一行分为更小的元素成为可能。
它们就是:
delims和tokens
delims用来告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
比如,还是上面的文件,我们执行下面的命令:
for/f"delims="%%iin(a.txt)doecho%%i
显示的结果是:
第1行第1列
第2行第1列
第3行第1列
为什么是这样的呢。
因为这里有了delims这个参数,=后面有一个空格,意思是再将每个元素以空格分割,默认是只取分割之后的第一个元素。
执行过程是:
将第一个元素“第1行第1列第1行第2列第1行第3列”分成三个元素:
“第1行第1列”“第1行第2列”“第1行第3列”,它默认只取第一个,即“第1行第1列”,然后执行do后面的命令,依次类推。
但是这样还是有局限的,如果我们想要每一行的第二列元素,那又如何呢?
这时候,tokens跳出来说,我能做到。
它的作用就是当你通过delims将每一行分为更小的元素时,由它来控制要取哪一个或哪几个。
还是上面的例子,执行如下命令:
for/f"tokens=2delims="%%iin(a.txt)doec