2012年8月3日

这可能是我2012年写的最长的一篇博客,足足写了一个星期。我自己都感动了。


—— 蜗牛出品,转载请说明出处 ——   
个人博客: www.isnail.me   
联系方式: me@isnail.me   
—— 蜗牛出品,转载请说明出处 ——   

前言: (不喜欢看前言的可以直接跳至正文开始处) 批处理是个很棒的东西,无奈于实在找不到像样的便捷的教程(应该是有的,但不是我想要的)。所以就想自己整理一个。鉴于个人本身对批处理不是很在行,所以有不足之处还请大家不吝指正。
前辈跟我说,杀猪不用牛刀,批处理也可以勉强算是一个简单的计算机语言了,可以用来处理一些小问题。

用一篇文章来说明批处理的用法可能字数有点多,所以就尽量少写,不然大家看着心烦。

列一下比较常用的命令以及用法。最后写几个应用,剩下的大家感悟吧。 然后,感谢为我提供文献资料的前辈,老师们。

最后请大家支持我,转载请标明出处。谢谢大家。

正文开始:

首先,批处理命令保存在以BAT为扩展名的文本文件中,这是一句废话大家都知道哈。然后按【WIN+R】然后输cmd敲回车打开命令行窗口,也是一句废话。然后我们可以用记事本或其他文本编辑软件都可以写,大家都懂得哈哈。。不要着急,下面正式开始哈哈。

打算介绍以下的语法与功能(15个章节)
1. 文件的创建与编辑方法
2. echo回显命令
3. @禁止回显命令
4. goto流程转向命令
5. pause暂停命令
6. call调用命令
7. start新窗命令
8. rem注释命令
9. if判断命令
10. set/setlocal环境变量命令
11. shift升参命令
12. for循环命令
13. 重定向(“”,”>>”)的应用
14. 管道符(“|”)的应用
15. 平常的一些应用

一、 文件的创建与使用方法(有一点基础的可以直接略过这段)

就说两种创建BAT的方法,一种是在命令行状态下写批处理文件。
第二种是用记事本写。一般人都会吧,可以直接跳过。

  1. 在命令行状态下写批处理文件。(这个方法我是不太用,太笨拙了,这段可以直接略过。)按【WIN+R】打开运行,输入“cmd”后点确定,打开命令行后输入”copy con MyFirstBat.bat”,按回车,进入屏幕编辑状态。根据需要输入命令,一行输一条命令(就是DOS命令),回车换行。输完按ctrl+z就会退出编辑状态并在当前目录下创建一个名为”MyFirstBat.bat”的批处理文件。

  2. 用记事本写(其实这段也可以直接略过,也是废话。如果有不知道什么是记事本的就直接关了不要往下看了)。按【WIN+R】,输notepad,敲回车,就打记事本了,然后一行一行的写,写完后点文件—>保存—>在”文件类型”列表中选择”所有文件”,然后输入文件名为MyFirstBat.bat完成。

写一段废话跟大家说说后面讲到的例子程序怎么练习,有一点点基础的可以直接略过这段。。。

先新建一个文本文档,然后把名字改成MyBatProgram.bat(注意是将原来的扩展名txt改为bat,如果你的电脑不显示扩展名请让它显示,不知怎么让他显示请百度加谷歌),把这个文件放到D盘根目录,然后指向这个文件点右键选“编辑”打开这个文件(不要直接双击打开,双击默认为运行该批处理)。

在里面敲例子程序(可以用COPY的,建议手写),写完之后打开CMD命令行窗口(不会的话参上文),然后在命令行窗口里输d: 敲回车(d加一个冒号,就是切换到D盘根目录),然后输入MyBatProgram敲回车,看到运行结果了吧天才(对照着代码和运行结果看),没看到 ,再试一次,还是人才。

————第一小节至此结束————

二、 echo回显控制命令

乡亲们在各种BAT中最常见的就是这个命令,几乎是必用命令了吧。大家也能猜到是干嘛的吧。

  1. 用于显示相关文字信息(比如欢迎使用,是否确定等)。

  2. 用于控制批处理文件在批处理过程中是否回显(就是运行的结果是不是显示出来)。

命令格式:echo [{on|off}] [message].
  • on是允许回显命令.
  • off是禁止回显.
  • message是要在屏幕上(就是命令行窗口里)显示的信息。

    例子1:
    ——————————————————
    echo 欢迎使用本程序,下面开启回显。
    echo on
    cd .
    echo 下面关闭回显
    echo off
    cd .
    ——————————————————
    

运行完了之后看看开回显和不开回显有什么区别,是不是发现关了回显之后的命令notepad的命令那一行就不显示了。发现了吧,你是个天才。没发现也不要紧,可能是看花眼了,以后会发现的。你还是个人才。

这段演示了,在echo on 和echo off的状态下命令的回显与不回显以及echo来显示一段文字。

然后你是不是发现echo off关闭回显虽然能关闭后面的命令,但回显却不能关闭自己本身。欲知如何处理,请看下节分解。

————第二小节结束————

三、 @禁止回显

“@”是一个非常了不起的非常简单的命令,用于禁止当前执行的命令回显在屏幕上。”@”不受”echo”命令设置效果的影响,而且本身也不会回显在屏幕上。

命令格式:@ [command]
  • command: 要屏蔽回显的命令
  • 当命令不加任何参数执行时,将不产生任何效果。

    例子2:
    ——————————————————
    echo 欢迎使用本程序,下面使用@
    @echo on
    @cd.
    @echo off
    @cd.
    echo 程序结束
    ——————————————————
    

从运行结果可以发现”@echo”命令禁止了”echo”命令本身的显示。也禁止执行的命令的回显。天才,发现了没,没发现,没事,还是人才。

————第三小节结束————

四、goto流程控制命令

学过C的应该知道这是什么吧,没错,基本跟C里一样。goto是一个流程控制转向命令,用于控制批处理中的命令执行流程(就是在某个地方插个标签然后咔嚓一下跳转到那个地方继续往下执行)

命令格式: goto label
  • label:表示批处理文件中某行,该行表示批处理文件新的执行点。

    例子3
    ——————————————————
    @echo off
    echo 欢迎使用本程序,下面展示goto
    echo .
    goto last
    echo这是被跳过的语句
    echo 路过
    echo 路过
    :last
    echo 看,程序路过前面的三句从这执行了
    echo .
    echo 程序结束
    ——————————————————
    

你懂得,不解释。注意标号通常单独占一行,以”:”开头并紧跟标识符,标识符中不能有逗号、冒号等,但可以使用空格。标识符有效长度为8个字符,超了的话不解释,你懂得。

————第四小节结束————

五、pause暂停命令

如果你把写好的BAT双击打开运行,是不是运行完了就没了(类似于一闪消失了)。如果你想停留住它怎么办呢,下面有请pause暂停命令闪亮登场。

pause命令用于暂停批处理命令的执行并给出提示信息,然后由用户决定是否继续执行。

命令格式:pause
  • pause:此命令非常简单,不需要任何参数。当命令执行,会中断执行的语句。

    例子4
    ——————————————————
    @echo off
    echo 欢迎使用本程序,下面展示pause
    echo .
    echo 路过
    echo 卡一下
    echo .
    pause
    echo .
    echo 路过
    echo 卡一下
    echo .
    pause
    echo .
    echo 程序结束
    ——————————————————
    

懂了吧,不解释,卡一下,按任意键继续执行,或者可以按ctrl+c中断执行。

————第五小节结束————

六、call调用命令

“call”是一个功能非常强大的命令,它不但可以在批处理中调用另一个批处理,而且可以调用指定标号处后面的所有指令。

命令格格:call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
  • [Drive:][Path] FileName:指定被调用的批处理文件名,当被调用的与正执行的位一同目录可省略盘符及路径。
  • :label:用于指定调用位置的标签,与goto语句中使用的标签类似。
  • arguments:对于心”:label”开关的批处理程序,指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理或者变量。

    例子5
    ——文件1(Test1.bat)————————
    @echo off
    echo 欢迎使用本程序,下面展示call
    echo .
    echo 文件一路过
    echo 呼叫文件2
    echo .
    call Test2.bat
    echo .
    pause
    echo .
    echo 准备跳转至label.
    call :label
    echo .
    echo后的语句执行完后,程序回到这继续运行
    echo .
    :label:
    echo 这是label到这了
    echo .
    echo 程序结束
    ——————————————————
    
    
    
    ——文件2(Test1.bat)————————
    echo .
    echo 文件2路过
    echo 展示完毕,按任意键继续展示label
    echo .
    ——————————————————
    

“call”命令在使用标号时,标识符前必须加上“:”号,而“goto”命令中则不需要加。此外,使用“call”命令转向标号并执行到文件结束时,会返回调用处继续执行下面的命令,而“goto”语句跳转后不再返回。

七、star新窗口命令

“star”命令呢,用于启一个新的命令行窗口,在新窗口中执行指定的程序或命令。这个参数有点多,不爱看就别看了,基本应用用的不多吧。

命令格式:start [“title”] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
  • title:指定在“命令提示符”窗口标题栏中显示的标题。
  • /dPath:指定启动目录。
  • /i:将Cmd.exe启动环境传送到新的“命令提示符”窗口。
  • /min:启动新的最小化“命令提示符”窗口。
  • /max:启动新的最大化“命令提示符”窗口。
  • /separate:在单独的内存空间启动16位应用程序。
  • /shared:在共享的内存空间启动16位程序。
  • /low:以空闲优先级启动应用程序。
  • /normal:以一般优先级启动应用程序。
  • /high:以高优先级启动应用程序。
  • /realtime:以实现优先级启动应用程序。
  • /abovenormal:以超出常规优先级的方式启动应用程序。
  • /belownormal:以超出常规优先级的方式启动应用程序。
  • /wait:启动应用程序,并等侍其结束。
  • /b:启动应用程序时不必打开新的“命令提示符”窗口。除非应用程序启用【Ctrl+C】组合键操作,否则将忽略【Ctrl+c】操作,按【Ctrl+Break】可中断应用程序。
  • FileName:指定要启动的命令或程序。
  • parameters:指定要传送给命令或程序的参数。
  • /?:在命令提示符显示帮助。

    例6
    ——文件1(Test.bat)————————
    @echo off
    echo 欢迎使用本程序,下面展示start
    echo .
    echo 将在新窗口中显示a.txt文件的内容
    echo .
    start “a.txt的内容” /wait type a.txt
    echo 已从新命令行窗口返回……
    echo .
    echo 程序结束
    ——————————————————
    
    
    ——文件2(1.txt)————————
    这是文件2,是TXT文件。
    ——————————————————
    

大体就是这么个样子,自行实验一下吧。

八、rem注释命令

注释大家都知道是干什么的吧,就是在批处理文件中加入相应的说明信息,帮助读者更加明白的阅读批处理文件。

命令格式:rem [comment]
  • /?:在命令提示符显示帮助。

    例子7
    ——————————————————
    @echo off
    rem 这是一个简单的批处理文件
    dir
    ——————————————————
    

就是简单的加注释,没什么好解释的,大家都明白。

九、if判断命令

“if”判断,这个懂点程序的基本知道是干嘛的吧,就是通过条件来判断批处理接下来该如何执行。

命令格式:IF[not] rrorlevel number command [else expression]
命令格式:IF[not] string1==string2 command [else expression]
命令格式:IF[/i] string1 compareop string2 command [else expression]
命令格式:IF cmdextversion number command [else expression]
命令格式:IF defined ariable command [else expression]
  • not:指定只有当条件为假时和执行该命令。
  • errorlevel number:只有当由Cmd.exe运行的前一个程序返回大于或等于number的退出代码时,才能指定真条件。
  • command:指定只有满足前面的条件时才应执行的命令。
  • string1==string2:只有当string1和string2相同时才能指定真条件。
  • exist filename:如果filename存在,则指定真条件。
  • compareop:指定长度为3个字母的比较运算符。其中,“EQU”代表等于,“NEQ”代表不等于,“LSS”代表小于,“LEQ”代表小于或等于,“GTR”代表大于,“GEQ”代表大于或等于。
  • /i:强制字符串比较忽略大小写。
  • cmdextversion number:只有当与Cmd.exe的“命令扩展”

    例子8
    ——————————————————
    @echo off
    IF exist a.txt (echo 找到了a.txt文件,其内容为: type a.txt)
    ELSE (echo 找不到a.txt文件)
    ——————————————————
    

if语句这么必备的指令,不用解释吧。有一点编程基础的亲们都明白吧。

十、set/setlocal环境变量命令

“set”就是用来创建、设置、查看或删除环境变量。对于一些功能复杂的批处理程序,自定义变量是不可缺少的。

set
命令格式:set [ [/a [expression]] [/p [variable=]] string]
  • /a:将string设置成可求值的数字表达式。
  • expression:合法的表达式
  • /p:将variable的值设置成输入行。
  • variable:指定需要设置或修改的变量。
  • string:指定要与指定变量关联的字符串。
  • /?:在命令提示符显示帮助。

    例子9.
    ——————————————————
    @echo off
    set xxx="c:\"
    echo 显示所有以字母x开头的变量
    set x
    dir /w %xxx%
    rem 删除名为xxx的变量
    set xxx=
    ——————————————————
    

批处理程序中首先定义了”xxx”变量中设置其值为”c:\”,然后显示了所有以”x”开关的变量。”dir /w %xxx%”命令中对”xxx”变量进行了引用,等价于”dir c:\ /w”命令。最后,通过”set xxx=”命令删除了”xxx”变量。

“setlocal”命令可在批处理程序运行时设置自身的临时变量环境,且不会影响到系统的变量环境设置。

setlocal:
命令格式:setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}
  • enableextension:启用命令扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。
  • disableextensions:禁用命令扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。
  • enabledelayedexpansion:启用延迟的环境变量扩展,直到出现匹配的endlocal命令。无论setlocal命令之前的设置如何。
  • disabledelayedexpansion:禁用延迟的环境变量扩展,直到出现匹配的endlocal命令,无论setlocal命令之前的设置如何。
  • /?:在命令提示符显示帮助。

    例子10.
    ——————————————————
    @echo off
    set local
    path=d:\
    echo 局部环境变量path的值:
    set path
    endlocal
    echo 系统环境变量path的值:
    set path
    ——————————————————
    

批处理执行到”setlocal”命令后将启用自己的临时变量环境,接下来设置”path”值。当”ndlocal”时,结束当前临时变量环境。此时再显示”path” 值。

注:“setlocal”须与”endlocal”命令联合使用,”endlocal”命令用于结束临时变量环境并回到系统变量环境。

十一、了解shift命令语法及应用

“shift”命令用于更改批处理文件处理台数的方式,如指定起始处理参数的位置等。

命令格式:shift[/n]
  • /n:设置批处理从第n个参数开始移位,n的值为0~8
  • /?:在命令提示符显示帮助。

    例子11.
    输入的命令要带参,输text a.txt b.txt c.txt执行。text是BAT文件。
    ——————————————————
    @echo off
    :round
    IF "%1%"=="" goto end
    echo %1内容如下:
    type %1%
    echo .
    shift
    goto round
    :end
    ——————————————————
    

其实shift的功能就是把参数表的参数上提一位,就是把第二个参数变成第一个参数,第三个参数变成第二个参数,类推。。。。。。。。

十二、for循环命令

“for”命令,有编程基础的亲们都知道是干嘛的吧,,,,最常用的循环指令,说白了就反复重复某一个操作。

命令格式:FOR{%variable | %%variable} in(set) do command [CommandLineOptions]
  • %variable|%%variable:代表可替换的参数。使用%variable通过命令提示符执行for命令。使用%%variable在批处理文件中执行for命令。
  • set:指定要用指定命令处理的一个或多个文件、目录、数值范围以及文本字符串。
  • command:指定要对包括在指定(set)中的每个文件、目录、数值范围以及文本字符串所执行的命令。
  • CommandLineOptions:指定要通过指定命令使用的任何命令行选项。
  • /?:在命令提示符显示帮助 。

    例子12.
    ——————————————————
    @echo off
    set /a sum=0
    FOR %%x IN (*.txt) DO (
    echo %x 文件的内容如下:
    type %x
    echo .
    set /a sum=sum+1
    )
    echo 一共显示了%sum%个文本文件!
    ——————————————————
    

For循环输出目录中的所有文本文件。自己试试哈。写不动了。

十三、重定向(“”,”>>”)的应用

重定向符用于控制数据的输入或输出方式。”””>>”符号左边是数据源,区别是”>”会替换目地数据,而”>>”只是将数据源添加到目标数据后。

    例子13.
    ——————————————————
    @echo off
    echo 正在自动创建的批处理
    echo echo进入auto.bat批处理文件中……
    echo type a.txt > auto.bat
    echo dir /b /w >> auto.bat
    echo 被自动创建的auto.bat文件的内容如下:
    type auto.bat
    echo.
    echo 排序后的auto.bat为:
    sort < auto.bat 
    —————————————————— 

看看执行结果,瞬间就明白了是怎么回事了吧。它会把当前目录下的TXT文件打印出来,在当前目录下建几个TXT试试看。 十四、管道符(“|”)的应用 管道符是将一个命令的输出数据提取出来,然后将提取的数据作为另一个命令的输入。

    例子14.
     —————————————————— 
    @echo off Find “testwords” test1.txt | sort > test2.txt
    echo 对包含”testwords”的行排序后如下:
    type test2.txt
    ——————————————————

test1里随便打几行包含testwords的东西试验一下,这个批处理首先在”test1.txt”文件中找出所有包含”testwords”的行,接着将找出的结果通过”|”传给”sort”命令进行排序,最后将排序结果保存到”test2.txt”文件。

十四、平常的一些应用

  1. 批量修改文件名(为当前目录所有文件添加.rar扩展名)

    编写以下将其保存为名为”reName.bat”
    ——————————————————
    @echo off
    echo 开始更改文件名…
    set ex=.rar
    set /a sum=0
    FOR %%m IN (*) DO (
    IF NOT "%%m"=="reName.bat" (
    ren %m %m%ex%
    set /a sum=sum+1
    )
    )
    echo 文件名改名完毕,一共有%sum%个文件被改名
    set sum=
    set ex=
    ——————————————————
    
  2. 自动运行某个程序(自动不断ping主机)

    ——————————————————
    @echo off
    echo 正在测试是否可以ping通主机10.11.11.11
    :again
    ping 10.11.11.11 > IF NOT (%ERRORLEVEL% EQU 0) goto again
    start "可以正常与主机通讯" echo 现在可以正常ping通主机了
    ——————————————————
    
  3. 自动接收用户输入的信息

    ——————————————————
    @echo off
    :repeate
    cls
    echo.
    echo.
    echo ########请选择操作##########
    echo -------1.输入1回车,显示当前日期
    echo -------2.输入2回车,显示当前时间
    echo -------3.输入其他后回车,终止批处理。
    echo.
    echo.
    echo 请选择要执行的操作
    set /p num=
    IF "%num%"=="1" (
    echo.
    echo 当前日期为:
    date /t
    pause
    goto repeate
    )
    IF "%num%"=="2" (
    echo.
    echo 当前时间为:
    time /t
    pause
    goto repeate
    )
    echo.
    echo 你输入了%num%字符,批处理自动退出
    ——————————————————
    

写不动了,大家如果认真看了学的也应该差不多了。举一反三吧。 希望你们喜欢!

—— www.isnail.me —— —— CopyAllRight by iSnail ——