批处理

本来以为批处理是DOS时代的过时产品,但是在最近学习汇编,以及在分析其它一些程序及脚本语言时,发现好多涉及批处理的东西,表示什么都不知道,今天就把批处理简单的学习了一下,这里简单的总结一下;

1.基本介绍:

批处理(Batch)是一种简化的脚本语言,它应用于DOSWindows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND.COM(在现在的机器上这个格式基本不支持了)或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何32位的Windows程序都可以放在批处理文件中运行。

2.几种简单的批处理命令:

   echo:

打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo
命令将显示当前回显设置。

语法

echo [{on|off}] [message]

Sample:

@echo off 

 echo hello world

在文本编辑器中输入以上命令,然后修改文件格式为xxx.bat,直接点击之后就会在CMD窗口运行显示 hello world   这些语句,关于on和off两个选项需要自己手动运行一下才可以真正体会带他们的不同之处。如下图所示:

在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定的文件中。

rem:关于这个命令仿照一下别人介绍

注释命令,类似于在C语言中的/*--------*/,它并不会被执行,只是起一个注释的作用,只有在编辑批处理时才会被看到,主要用于方便修改。

:: 也具有rem的功能

但::和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。
但是当打开回显时,rem和rem

后的内容会显示出来,然而::后的内容仍然不会显示。

Rem [注释内容]

sample:

rem Hello world。

pause:

暂停命令。运行 Pause 命令时,将显示下面的消息:

Press any key to continue. . .(或:请按任意键继续. . .)

sample:

@echo off

echo 下面的样式就是pause命令的功能:

      pause

如下图所示:


call:

从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call
命令接受用作调用目标的

标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。

语法

call [路径 文件名] [标签]]

参数

[Drive:}[Path] FileName

指定要调用的批处理程序的位置和名称。

sample:

@echo off

echo 我们利用call来调用一下自己电脑上的计算器出来

call calc.exe

pause



start:命令很简单,参数很复杂

调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。

如:start calc.exe即可打开Windows的计算器。

常用参数:

MIN 开始时窗口最小化

SEPARATE 在分开的空间内开始 16 位 Windows 程序

HIGH 在 HIGH 优先级类别开始应用程序

REALTIME 在 REALTIME 优先级类别开始应用程序

WAIT 启动应用程序并等候它结束

parameters 这些为传送到命令/程序的参数

执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令

脚本内执行,该新行为则不会发生

sample:

@echo off

echo  下面我们用start命令打开cmd窗口:

start cmd.exe

pause

如下图:



goto:

这是个很有意思的命令。。。

跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。

语法:goto label (label是参数,指定所要转向的批处理程序中的行。

sample:

:1

start

goto 1

运行以上这段命令,就会打开很多个窗口(用来整人相当不错)。这段命令的意思是,先用start命令打开窗口,再用goto 1命令转到1标签,即第一行后面的命令。注意标签名字前面要加上英文的冒号。

标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:
用来表示这个字母是标签,goto

命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

这个示例就不截图。。。内存马上爆炸,死机 你懂得

set:

显示、设置或删除变量

显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。

设置和调用变量:例如set aa=abcd,就是把aa定义为abcd。如果要调用这个变量,就把aa两边加上个百分号。

例如:

set aa=abcd

echo %aa%

pause

运行这段命令就会显示“abcd”。

删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令无实质意义。

需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。

set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。

3.几种批处理符号介绍

    @:

  回显屏蔽符号,表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人
的硬盘)自然不能让对方看到你使用的命令啦。

下面是命令前使用@的样式:

下面是不适用@的样式:



>,  >>:  <

重定向符号:

将输出信息重定向到指定的设备或文件。系统默认输出到显示器

如:echo aaaaa>a.txt 即可将本在显示器上显示的信息aaaaa输出到文件a.txt中,屏幕上没有任何显示。如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaaaa。

echo aaaaa>>a.txt 类似于echo aaaaa>a.txt。区别在于:如果a.txt本已存在,>a.txt会擦除a.txt中的原有内容,而>>a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa。a.txt不存在时,二者没有差别。

<:

将输入信息来源重定向为指定的设备或文件。系统默认从显示器读取输入信息。

重定向使用举例:

@echo off

echo abcdefg——这是文件a.txt中的信息>a.txt

echo 请任意输入字符,以回车结束:

set /p ifo=

cls

echo 从屏幕获得的输入信息 

echo %ifo%

set /p ifo=<a.txt

echo  从文件a.txt获得的输入信息 

echo %ifo%

pause

如下图所示:自己可以运行一下体会一下




|:

管道符号,将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。

使用格式为:command_1|command_2

管道符号使用举例:

=========================================

@echo off

echo aaaa>a.txt

del /p a.txt

pause

=========================================

@echo off

echo aaaa>a.txt

echo y|del /p a.txt

pause

=========================================

对比以上两个批处理执行结果,读者即可明白管道符的用法和效果。

需要说明的是,上面del命令添加开关/p只是为了让读者明白管道符号的使用方法,实际删除文件时不加/p开关即可实现无提示直接删除。

如下图不使用管道符:


如下图使用管道符:


^

转义符,

特殊符号转化为一般符号,即剥离特殊符号的特殊地位。特殊符号指:| & > <

比如,如果我们想输出符号“>;”,直接用命令 echo > 是不行的,必须修改为 echo ^>;。其余几个特殊符号类似需要有同样的处理。

转义字符使用举例:

=========================================

@echo off

echo aaaa>a.txt

echo 第一句echo执行完毕

echo aaaa^>a.txt

echo 第二句echo执行完毕

pause

=========================================

比较上面的两句echo,第一句echo将信息aaaa输出到了文件a.txt,而第二句echo则在直接屏幕上显示出aaaa>a.txt

如下图所示:



&;、&&;、||

逻辑命令符,

&-它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败;

&&-当&&;前面的命令成功执行时,执行&&;后面的命令,否则不执行;

||-当||前面的命令失败时,执行||后面的命令,否则不执行。



4.批处理的一些语句结构:


 if语句:

if语句实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能


字符串比较

if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。其命令格式为:

IF [not] string1 compare-op string2 command1 [else command2]

其中,比较操作符compare-op有以下几类:

== - 等于

EQU - 等于

NEQ - 不等于

LSS - 小于

LEQ - 小于或等于

GTR - 大于

GEQ - 大于或等于

选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。

字符串比较示例:

===============================================

@echo off

set str1=abcd1233

set str2=ABCD1234

if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)

if /i %str1% LSS %str2% (echo str1^<str2) else (echo str1^>=str2)

echo.

set /p choice=是否显示当前时间?(y/n)

if /i not %choice% EQU n echo 当前时间是:%date% %time%

pause>nul

===============================================

对于最后一个if判断,当我们输入n或N时的效果是一样的,都不会显示时间。如果我们取消开关/i,则输入N时,依旧会显示时间。

另外请注意一下几个细节:1-echo str1^<str2和echo str1^>=str2;2-echo.。




结果判断

masm %1.asm

if errorlevel 1 pause & edit %1.asm

link %1.obj

先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用link程序连接生成的obj文件,这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause & edit %1.asm部分)。

另外,和其他两种用法一样,这种用法也可以表示否定。用否定的形式仍表达上面三句的意思,代码变为:

masm %1.asm

if not errorlevel 1 link %1.obj

pause & edit %1.asm



for语句:

for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。

1.无开关

无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:

FOR %%variable IN (set) DO command

其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。

无开关for语句举例:

===============================================

@echo off

for %%i in (a,"b c",d) do echo %%i

pause>nul

===============================================

2.开关/L

含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:

FOR /L %%variable IN (start,step,end) DO command

其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。

含开关/L的for语句举例(创建5个文件夹):

===============================================

@echo off

for /l %%i in (1,2,10) do md %%i

pause

===============================================

上例将新建5个文件夹,文件夹名称依次为1.3.5.7.9。可以发现,%%i的结束值并非end的值10,而是不大于end的一个数。

3.开关/F

含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:

FOR /F ["options"] %%variable IN (set) DO command

其中,set为("string"、'command'、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。

含开关/F的for语句举例:

===============================================

@echo off

echo **No Options:

for /f %%a in ("1,2,10") do echo a=%%a

echo **Options tokens ^& delims:

for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c

pause

===============================================

@echo off

echo 本文件夹里面的文件有:

for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (

if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b

pause

===============================================

@echo off

echo 本文件夹里面的文件有:

dir>c:\file.txt

for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (

if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b

del c:\file.txt

pause

===============================================

对于后面的两个例子,其中options里面的delims= 是可以删除的,因为只要添加了/F开关系统就将delims的值默认为空格。

符号字符串中的最后一个字符星号,

那么额外的变量将在最后一个符号解析之后

分配并接受行的保留文本。本例中也可以改为4,不过文件名中有空格的文件,只能显示空格以前部分

同时我们也看到了,for语句的do后面的command也是可以分行的,只需要保证command的左括号和do在同一行就可以了。




5.最后要加上关于如何调用系统时间:

@echo off

echo %date%

echo %time%

pause

调用这两个变量,可以直接显示系统当前的时间。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值