站长友情链接平台,一共有多少网站,廊坊网站建设价格,音乐网站答辩Windows批处理命令学习一 Windows的批处理命令固然比不上unix的shell脚本强大#xff0c;但用好了仍能给我们的工作带来很大作用。一个朋友问我为什么学习批处理命令#xff0c;我以《程序员修炼之道——从小工到专家》一书的一句话答复他#xff1a;图形界面的优点是所见即…Windows批处理命令学习一 Windows的批处理命令固然比不上unix的shell脚本强大但用好了仍能给我们的工作带来很大作用。一个朋友问我为什么学习批处理命令我以《程序员修炼之道——从小工到专家》一书的一句话答复他图形界面的优点是所见即所得图形界面的缺点是所见就是所有所得而批处理命令组合起来功能强大快捷。现在就让我们来学习下吧。下面红色字为批处理命令 基本的命令 echo off echo的意思是回旋这里的意思就是回显echo off意思就是关闭回显前面的表示echooff 这一行也不会回显你可以试着去掉和整行去掉的另一个功能是在执行完批处理文件时自动恢复命令回显。 动手实践 1. 在某个目录下建一个1.bat分别往文件输入命令
echo off
dir
和
echo off
dir
以及
dir然后在命令控制台运行1.bat看看有何不同 call
CALL[drive:][path]filename [batch-parameters] batch-parameters 指定批处理程序所需的命令行信息。
动手实践
在C盘上建一个批处理文件Echo.bat
echo %1
然后在命令行窗口输入命令
call C: \Echo.bat thisis a test
看看效果是什么。
pause 暂停批处理程序的执行并显示一条消息提示用户按任意键继续执行。只能在批处理程序中使用该命令。 rem
表示此命令后的字符为解释行注释不执行只是给自己今后参考用的相当于程序中的注释
同时你可以用两个冒号来替代rem如 ::等同于一个rem但他们有个区别就是用::作注释的话他是不回显的即使你打echo on强制回显也没有同的同时rem可以在config.sys中加注释
语法 rem[commnet] 学批处理命令的一个小体会时刻想着要运用特别是进行批量操作时这样才能学以致用。
继续学习Windows批处理命令。 批处理文件参数
有点编程基础的人都知道函数有参数批处理文件也有参数。批处理文件还可以像C语言的函数一样使用参数相当于DOS命令的命令行参数这需要用到一个参数表示符%。 %[1-9]表示参数参数是指在运行批处理文件时在文件名后加的以空格或者Tab分隔的字符串。变量可以从%0到%9%0表示批处理命令本身其它参数字符串用%1到%9顺序表示。
动手实践
新建一个批处理文件a.bat在里面输入命令
echo off
ping %1
ping %2 然后在命令控制台环境下输入命令C:\Users\zhuC:\a.bat www.163.comwww.sina.com
看看有什么效果同时领悟下如何使用多个批处理文件参数。 if命令
if语句一共有3种模式,如下: IF [NOT]string1string2 command
IF [NOT]EXIST filename command
IF [NOT]ERRORLEVEL number command NOT 指定只有条件为 false 的情况下 Windows XP 才应该执行该命令。 ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码指定条件为 true。 string1string2 如果指定的文字字符串匹配指定条件为 true。 EXIST filename 如果指定的文件名存在指定条件为 true。 command 如果符合条件指定要执行的命令。如果指定的条件为 FALSE命令后可跟一个执行 ELSE关键字后的命令的 ELSE 命令。
我们先讲解第一种:
IF [NOT]string1string2 command
自然语句意思如果string1string2那么执行command
下面再举个能实际应用的if语句
自然语句如果输入的参数为那么显示a
计算机语句
echo off
if%13 echo a3
或者写成
echo off
if %13echo a3
注意:当要测试的时候,因在cmd底下,输入1.bat 3.因为这里用了是传递参数,具体看文章前部分批处理文件参数.
第二种
IF [NOT]EXIST filename command
这条命令用语检测文件是否存在如果存在执行command如果不存在则什么也不显示
如我们想检查e盘根目录下是否有一个叫.txt的文件如果存在则显示exist如果不存在则什么也不显示
批处理命令如下
echo off
if existe:2.txt echo exist 2.txt 第三种
比起前两种第三种比较难懂我也看得半懂不懂的。查了一些资料大致理解了理解IF[NOT] ERRORLEVEL number command的这句的关键是ERRORLEVEL这个到底指什么
原来每一行的DOS命令运行完都有一个返回值你可以把它比作是程序中的函数的返回值。一般上一条命令的执行结果代码只有两结果,成功用0表示 失败用1表示.。ERRORLEVEL就是用来保存这个返回值的。就是假如ERRORLEVEL大于等于numbernumber为你给定的常数或批处理文件参数则执行command。 还是让我们做实验来理解吧。
动手实践 新建一个批处理文件a.bat在里面输入命令
echo off
ping %1
ping %2 然后在命令控制台环境下输入命令C:\Users\zhuC:\a.bat www.163.comwww.sina.com
看看有什么效果同时领悟下如何使用多个批处理文件参数。
echo off
net user
IF ERRORLEVEL 1 echo net user 执行失败了! 可能你要说我想要提示执行命令的信息那你可以这样写
echo off
net user
IF NOT ERRORLEVEL 1 echo net user 执行成功了! 可能你觉得这种写法别扭同时你觉得应该是提示执行成功反之提示失败。呵呵那么我们就改成下面试试
echo off
net user
if%ERRORLEVEL% 0 (
echo netuser 执行成功了!
)else (
echo netuser 执行失败了!
) 这是if和else的配套使用其中if %ERRORLEVEL% 0是假如ERRORLEVEL等于0。值得注意的是if和else的配套使用有着严格的使用格式必须是
if%ERRORLEVEL% 0 (
command // 执行命令
)else (
command // 执行命令
)
goto命令 说实话看完这个命令我立即想起C语言的goto语句。事实上这个命令和C语言的goto语句也非常相像也很简单。动手实践下你就知道了。
新建一个批处理文件a.bat在里面输入命令
echo off
net user
if%ERRORLEVEL% 0 goto successed
if%ERRORLEVEL% 1 goto failed
:successed
echo netuser 执行成功
gotoreturn
:failed
echo netuser 执行失败
:return set命令 set命令我比较常用的是用来设置环境变量。它的用法很简单例子如下
set hostsc:/windows/system32/drivers/etc
注意set命令只能设置当前cmd下才有效的环境变量。 参考文献 1.网上一位大侠姓名不详写的《批处理文件教程》 Windows批处理命令学习三
for命令 这是一个非常有用的命令。for命令其实就是一个循环命令,如果我们想重复一个语句,就可以用for命令.通过for命令,可以控制循环的次数等.
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令
参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释 %%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他; IN:命令的格式,照写就是了; (相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下面的例子 do:命令的格式,照写就是了! 执行的命令:对每个变量的值要执行什么操作就写在这.
可以在CMD输入for /?看系统提供的帮助!对照一下 FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。值得注意的是IN (set)中IN和(之间有一个空格。 现在开始讲每个参数的意思
/d 仅为目录 如果 Set (也就是我上面写的 相关文件或命令) 包含通配符* 和 ?将对与 Set 相匹配的每个目
录而不是指定目录中的文件组执行指定的 Command。
系统帮助的格式:FOR /D%%variable IN (set) DO command 他主要用于目录搜索,不会搜索文件,看这样的例子
echo off for /d %%i in (*) do echo %%i pause
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示! 在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
echo off for /d %%i in (???) do echo %%i pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了。 一个小例子是批处理扫描当前目录的所有子目录名称 echo off for /d %%i in (e:\*) do echo %%i 注意拉该命令只扫描当前目录的子目录名称不会扫瞄子目录中所包含的子目录名称。 思考题目:
echo off for /d %%i in (window?) do echo %%i pause
保存到C盘下执行,会显示什么呢?自己看吧! /D参数只能显示当前目录下的目录名字,这个大家要注意! /R 递归 进入根目录树[Drive:]Path在树的每个目录中执行for 语句。如果在 /R 后没有指定目录则认为是
当前目录。如果 Set 只是一个句点 (.)则只枚举目录树。 系统帮助的格式:FOR /R[[drive:]path] %%variable IN (set) DO command
上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比
/D强大多了! 他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!
echo off for /r c:\ %%i in (*.exe) do echo %%i pause
咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部
的EXE文件都列出来了,这里的c:\就是目录了。
再来一个 echo off for /r %%i in (*.exe) do echo %%i pause
参数不一样了这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这
个BAT你把他防灾d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出
来!!! 一个例子是批处理扫描当前目录下的所有子名录及所有子目录的子目录名称。代码异常简单如下 For /r c:\%%i in (.) do echo %%i 注意哦该代码会扫描出当前目录下的所有子目录名称及子目录中所包含的所有子目录名称。 /L 迭代数值范围 使用迭代变量设置起始值(Start#)然后逐步执行一组范围的值直到该值超过所设置的终止值 (End#)
。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#就会执行该命令。
如果迭代变量超过 End#则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执
行此范围内的值。例如(1,1,5)生成序列 1 2 3 4 5而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是
系统帮助的格式:for /L%% Variable in (Start#,Step#,End#) do Command
例如
echo off for /l %%i in (1,1,5) do echo %%i pause
保存执行看效果,他会打印从1 2 3 4 5 这样5个数字 (1,1,5)这个参数也就是表示从1开始每次加1直到5终止!
再看这个例子 echo off for /l %%i in (1,1,5) do start cmd pause
执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,
我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!
当然我们也可以把那个startcmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535
看完这个被我赋予破坏性质的参数后,我们来看最后一个参数 /f
含有/F的for详细说明
含有/F的for有很大的用处在批处理中使用的最多用法如下 格式 FOR /F [options] %%i IN (file) DO command
FOR /F [options] %%i IN(string) DO command
FOR /F [options] %%i IN(command) DO command
这个可能是最常用的也是最强的命令主要用来处理文件和一些命令的输出结果。
file代表一个或多个文件
string 代表字符串
command代表命令
[options] 可选
对于FOR /F %%iIN (file) DO command
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中的内容会用什么命令呢当然是typetype a.txt
for也可以完成同样的命令
for /f %%i in (a.txt) do echo %%i
还是先从括号执行因为含有参数/f,所以for会先打开a.txt然后读出a.txt里面的所有内容把它作为一个集合并且以每一行作为一个元素所以会产生这样的集合
{第1行第1列 第1行第2列 第1行第3列 //第一个元素
第2行第1列 第2行第2列 第2行第3列 //第二个元素
第3行第1列 第3行第2列 第3行第3列} //第三个元素
集合中只有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 %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容因为/f的作用会读出a.txt中 的内容。
for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字并不会读取其中的内容。
通过上面的学习我们发现for/f会默认以每一行来作为一个元素但是如果我们还想把每一行再分解更小的内容该怎么办呢不用担心for命令还为我们提供了更详细的参数使我们将每一行分为更小的元素成为可能。
它们就是delims和tokens
delims 用来告诉for每一行应该拿什么作为分隔符默认的分隔符是空格和tab键
比如还是上面的文件我们执行下面的命令
for /f delims %%i in (a.txt)do echo %%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 tokens2 delims %%i in(a.txt) do echo %%i
执行结果
第1行第2列 第2行第2列 第3行第2列
如果要显示第三列那就换成tokens3。
同时tokens支持通配符*以及限定范围。
如果要显示第二列和第三列则换成tokens2,3或tokens2-3,如果还有更多的则为tokens2-10之类的。
此时的命令为
for /f tokens2,3 delims %%iin (a.txt) do echo %%i %%j
怎么多出一个%%j
这是因为你的tokens后面要取每一行的两列用%%i来替换第二列用%%j来替换第三列。
并且必须是按照英文字母顺序排列的%%j不能换成%%k因为i后面是j
执行结果为
第1行第2列第1行第3列 第2行第2列第2行第3列 第3行第2列第3行第3列
对以通配符*就是把这一行全部或者这一行的剩余部分当作一个元素了。
比如
for /f tokens* delims %%i in(a.txt) do echo %%i
执行结果为
第1行第1列第1行第2列 第1行第3列 第2行第1列第2行第2列 第2行第3列 第3行第1列第3行第2列 第3行第3列
其实就跟for /f %%iin (a.txt) do echo %%i的执行结果是一样的。
再如
for /f tokens2,* delims %%iin (a.txt) do echo %%i %%j
执行结果为
第1行第2列第1行第3列 第2行第2列第2行第3列 第3行第2列第3行第3列
用%%i代替第二列用%%j代替剩余的所有
最后还有skip合eol这俩个简单skip就是要忽略文件的前多少行而eol用来指定当一行以什么符号开始时就忽略它。
比如
for /f skip2 tokens* %%i in(a.txt) do echo %%i
结果为:
第3行第1列第3行第2列 第3行第3列
用skip来告诉for跳过前两行。
如果不加tokens*的话执行结果为
第3行第1列
不知道怎么回事。
再如当a.txt内容变成
.第1行第1列 第1行第2列 第1行第3列 .第2行第1列第2行第2列 第2行第3列 第3行第1列第3行第2列 第3行第3列
执行for /feol. tokens* %%i in (a.txt) do echo %%i结果是
第3行第1列第3行第2列 第3行第3列
用eol来告诉for忽略以.开头的行。
同样也必须加tokens*否则只会显示第3行第1列