批处理简明教程精华版

批处理简明教程
一、

什么是批处理

批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。

批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。

它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一个命令,每个命令里可以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程度高。

.bat是dos下的批处理文件; .cmd是nt内核命令行环境的另一种批处理文件

首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令,你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。

批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。

批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。

以bat为扩展名的批处理程序:由https://www.360docs.net/doc/2211480465.html, (事先载入内存)解释分析,分析一行,执行一行,文件本身不载入内存,这就是区别于.exe文件(exe载入内存)

C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中

二、

批处理常用命令

1、@

它的作用是隐藏它后面这一行的命令本身(只能影响当前行)。

2、echo

中文为“反馈”、“回显”的意思。它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo命令状态(off或on)执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果。

echo. :输出空行,即相当于输入一个回车;值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。


3、start 命令

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

用。

start /wait :

start命令会启动软件的安装程序,而/wait命令会让系统在处理批处理文件中的下一条命令之前等待前一个软件安装完成。使用/wait命令是很重要的,只有这样才不会让批处理文件中的所有命令一下子全部执行起来,那样将会导致同一时间运行多个软件的安装程序。

如:几秒钟让你的内存耗尽(例一):

@Echo off

Start

cmd:开启CMD程序)

%0

4、pause

中文为“暂停”的意思。它的作用,是让当前程序进程暂停一下,并显示一行信息:请按任意键继续. . .。我们可以加 >nul把这个信息隐藏。

5、:和goto

为什么要把这两个命令联合起来介绍?因为它们是分不开的,无论少了哪个或多了哪个都会出错。goto是个跳转命令,:是一个标签。当程序运行到goto时,将自动跳转到:定义的部分去执行了。如:为你的右键添加P处理(例二)

@echo off

echo 输入 1 后按回车键, 添加右键P处理

echo 输入 2 后按回车键, 退出

echo.

set /p start=请选择 (1、2) 后按回车键:

if "%start%"=="1" goto 1

if "%start%"=="2" goto 2

:1

@echo off

color 1a

reg add HKCR\.bat\ShellNew /v nullfile /f >nul

reg add HKCR\batfile /ve /d P处理 /f >nul

exit

:2

Exit

6、%

这个百分号严格来说是算不上命令的,它只是批处理中的参数。

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0有两个意义

一是表示批处理命令本身,还一个就是无限循环,其它参数字符串用%1到%9顺序表示。

如:

%0表示批处理命令本身

新建一个1.BAT文件。输入以下内容:

@echo off

del

%0

pause

大家看效果,1.BAT已经被删除了。

还一个意思无限循环!如例一。无限执行start cmd 这条命令!

%1、%2……的意思:

例:@echo off

echo %1 %2 %3

echo %1

echo %2

echo %3

进入CMD,输入cd c:\

然后输入 test.bat 我是第一个参数

我是第二个参数

我是第三个参数

注意中间的空格,我们会看到这样的结果:

我是第一个参数

我是第二个参数

我是第三个参数

我是第一个参数

我是第二个参数

我是第三个参数

对比下代码,%1就是我是第一个参数 %2就是我是第二个参数

还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用在输入%1 %2来确定一个个的

例子

@echo off

echo %*

同样保存为test.bat 放到C盘

进入CMD,输入cd c:\

然后输入 test.bat 我是第一个参数

我是第二个参数

我是第三个参数

我是第四个参数

可以看到他一次把全部参数都显示出来了

现在说自定义变量

故名思

意,自定义变量就是由我们来给他赋予值的变量;要使用自定义变量就得使用set命令了,看例子.

@echo off

set var=我是值

echo %var%

pause

保存为BAT执行,我们会看到CMD里返回一个 "我是值"

var为变量名,=号右边的是要给变量的值

这就是最简单的一种设置变量的方法了

如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数

例子:

@echo off

set /p var=请输入变量的值

echo %var%

pause

var变量名 =号右边的是提示语,不是变量的值。变量的值由我们运行后自己用键盘输入!

7、if

if命令是一个表示判断的命令,根据得出的每一个结果,它都可以对应一个相应的操作。


(1)、输入判断


if "参数" == "字符串" 待执行的命令


参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)


如if "%1"=="a" format a:

再如例二。


(2)、存在判断。例:

if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif

如果存在那些gif文件,就删除这些文件。注意,这里的条件判断是判断存在的,当然也可以判断不存在的,例如下面这句“如果不存在那些gif文件则退出脚本”:if not exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一个not来表示否定而已。

(3)、结果判断。例:

masm %1.asm

if errorlevel 1 pause & edit %1.asm

link %1.obj

这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause & edit %1.asm部分)。

8、call

在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。

9、find

这是一个搜索命令,用来在文件中搜索特定字符串,通常也作为条件判断的铺垫程序。这个命令单独使用的情况在批处理中是比较少见的,因为没什么实际意义。

下例中,如果不使用type命令列出a.txt中的内容,而是直接使用find命令在a.txt中找“8000”,就必须得给出这个a.txt的绝对路径,如果没有指定路径,find将搜索键入的或者由另一个命令产生的文字。这里的“另一个命令”指的就是type命令了。

@echo off

cd\

netstat -an > a.txt

type a.txt | find "8000" && echo "Congratulations! You have infected 灰鸽子!"

del a.txt

pause & exit


10、for


循环命令,只要条件符合,它将多次执行同一命令。

语法:FOR %%variable IN (set) DO command [command-parameters]

对一组文件中的每一个文件执行某个特定命令。

%%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件

。可以使用通配符。

command

指定对每个文件执行的命令。


command-parameters

为特定命令指定参数或命令行开关。

例如一个批处理文件中有一行:

for %%c in (*.bat *.txt) do type %%c

则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。


FOR %%a IN ( C: D: E: F: G: H: ) DO ATTRIB -R -H -S %%a\SXS.EXE & DEL /F /Q /A -R -H -S %%a\SXS.EXE & ATTRIB -R -H -S %%a\AUTORUN.INF & DEL /F /Q /A -R -H -S %%a\AUTORUN.INF


该命令删除根目录下所有SXS.EXE和AUTORUN.INF文件.


 在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。直接在命令行则只需要一个%号。变量名称是区分大小写的,所以 %i 不同于 %I


11、SET


显示、设置或删除 cmd.exe 环境变量。 


要显示当前环境变量,键入不带参数的 SET。


/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。


/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序操作。


如: set /p start=请选择 (1、2、3) 后按回车键:


if "%start%"=="1" goto 1


if "%start%"=="2" goto 2


if "%start%"=="3" goto 3

管道命令:

1、|

它的作用,就是把前一命令执行的结果传到后一命令去处理。

如:help | more

回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动停止返回DOS。

这里结合了管道命令|和DOS命令more来共同达到目的的。

2、>、>>

这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。

3、<

<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。

例:sort < list.txt > alphlist.txt

sort 命令按字母顺序排列文本文件或命令的输出。在此范例中,sort 命令对 List.txt 文件的行进行排序并显示结果,但不更改文件。并将结果存到 Alphlist.txt 文件中。

组合命令:

顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了,那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。

1、&


这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。如:copy a.txt b.txt /y & del a.txt

2、&&

这个命令可以把它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。(当然这个和IF命令差不多,可以自己选择喜欢的方式)

小提示:有些命令是不能同时执行的

如:出道题:把C盘和D盘的文件和文件夹列出到a.txt文件中。

有人说,同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛:

dir c:\ && dir d:\ > a.txt

错了!这样执行后a.txt里只有D盘的信息!为什么?就因为这里&&命令和>命令不能同时出现一个句子里(批处理把一行看成一个句子)!!组合命令&&的优先级没有管道命令>的优先级高!所以这句在执行时将本分成这两部分:dir c:\和dir d:\ > a.txt,而并不是如你想的这两部分:dir c:\ && dir d:\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:

dir c:\ > a.txt && dir d:\ >> a.txt

当然这里还可以利用&命令:dir c:\ > a.txt & dir d:\ >> a.txt

3、||

这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。

题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例:

@echo off

dir s*.exe || exit

其实这个例子是有破绽的,如果存在那个exe文件,就退出;如果不存在那个exe文件,也退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir s*.exe执行肯定是不成功的,所以就继续执行exit,自然就退出了。那么如何解决题目给出的问题呢?看下例:

@echo off

dir s*.exe || echo Didn't exist file s*.exe & pause & exit

这样执行的结果,就能达到题目的要求,是否存在s*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪而过的窗口,echo就白写了。

几个符号:

1、符号(" ")

" "符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法.例:

c:\>cd "Program Files"

c:\>cd progra~1

c:\>cd pro*

以上方法都可以进入Program Files目录

2、符号(,)

,符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例:

c:\>dir,c:\

3、符号(;)

;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行

过程中发生错误则只返回错误报告但程序还是会继续执行。例:DIR C:\;D:\;E:\F:\

以上的命令相当于

DIR C:\

DIR D:\

DIR E:\

DIR F:\

4、符号“::”

这个符号的作用很简单,它是注释命令,在批处理脚本中和rem命令等效。它后面的内容在执行时不显示,也不起任何作用,因为它只是注释,只是增加了脚本的可读性。与rem 不同的是, ::后的字符行在执行时不会回显,无论是否用echo on打开命令行回显状态。

5、符合“^”

^是对特殊符号"<",">","&"的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。

比如echo test ^>1.txt

结果则是他没有追加在1.txt里,只是显示了出来

一、

利用批处理修改注册表

1、添加值

REG

ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]

KeyName [\\Machine\]FullKey

远程机器的机器名 - 忽略默认到当前机器。

远程机器上只有 HKLM 和 HKU。

FullKey ROOTKEY\SubKey

ROOTKEY [ HKLM | HKCU | HKCR | HKU | HKCC ]

SubKey 所选 ROOTKEY 下注册表项的完整名

/v 所选项之下要添加的值名

/ve 为注册表项添加空白值名<无名称>

/t REG Key 数据类型

[REG _SZ | REG _MULTI_SZ | REG _DWORD_BIG_ENDIAN |

REG _DWORD | REG _BINARY | REG _DWORD_LITTLE_ENDIAN |

REG _NONE | REG _EXPAND_SZ ]

(reg_dword 四字节数值数据,十六进制值 reg_binary二进制值 reg_sz字符串 reg_multi_sz多字符串 reg_expanda_sz带变量的字符串)

如果忽略,则采用REG _SZ

/s 指定一个在REG _MULTI_SZ 数据字符串中

用作分隔符的字符

如果忽略,则将 "\0" 用作分隔符

/d 要分配给添加的注册表 ValueName 的数据

/f 不用提示就强行改写现有注册表项

例如:

REG

ADD file://ABC/HKLM/Software/MyCo

添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo

REG

ADD HKLM\Software\MyCo /v Data /t REG _BINARY /d fe340ead

添加一个值(名称: Data,类型: REG _BINARY,数据: fe340ead)

REG

ADD HKLM\Software\MyCo /v MRU /t REG _MULTI_SZ /d fax\0mail

添加一个值(名称: MRU,类型: REG _MUTLI_SZ,数据: fax\0mail\0\0)

REG

ADD HKLM\Software\MyCo /v Path /t REG _EXPAND_SZ /d %%systemroot%%

添加一个值(名称: Path,类型: REG _EXPAND_SZ,数据: %systemroot%)

注意: 在扩充字符串中使用双百分比符号( %% )

2、删除值

REG DELETE


/v ValueName


删除子项下的特定项。如果未指定项,则将删除子项下的所有项和子项。


/ve


指定只可以删除为空值的项。


/va


删除指定子项下的所有项。使用本参数不能删除指定子项下的子项。


/f


无需请求确认而删除现有的注册表子项或项。


例:要删除注册表项 Timeout 以及其所有子

项和值,请键入:


REG DELETE HKLM\Software\MyCo\MyApp\Timeout


要删除计算机 ZODIAC 上 HKLM\Software\MyCo 下的注册表值 MTU,请键入:


REG DELETE file://ZODIAC/HKLM/Software/MyCo /v MTU

二、

隐藏批处理窗口

众所周知,批处理在执行的时候无论是否在开头加了@echo off或每条语句前加@,都会出现个一闪而过的窗口.那么如何才能去掉这个窗口,让批处理隐藏运行呢?

只要是批处理,都会先调用CMD来执行.即使在批处理里加上隐藏窗口的命令,由于是先调用CMD后执行命令,所以还是会出现一个闪过的窗口.那么我们就先用命令来隐藏窗口,再执行批处理,这样就不会出现那窗口了!

我们可以先在记事本上输入如下内容:

Set ws = CreateObject("Wscript.Shell")

ws.run "cmd /c ql.bat",vbhide

或者CreateObject("WScript.Shell").Run "cmd /c ql.bat",0

(注:ql.bat 为你要执行的批处理的名字。ql.bat里最后处最好添加 @ del ql.bat和@del yc.vbs这两行内容)

保存为yc.vbs文件。

然后用RAR文件把yc.vbs文件和ql.bat文件压缩,在常规项里把“创建自解压压缩文件”和“锁定压缩文件”两项前打勾,然后“高级”——“自解压选项”——“常规”——“解压后运行”输入yc.vbs——再选择“模式”——“安静模式”(全部隐藏)——“覆盖方式”(覆盖所有文件)——然后确定,生成EXE可执行文件即可。那么,再运行这个EXE文件,你将把CMD的窗口隐藏了。


这部分主要是补充。有点杂乱。

Ps:在批处理加入如下内容

1、title 盘符添加背景图

在CMD菜单栏显示“盘符添加背景图”标题

color 0E

设置批处理内容颜色。可以是0A;0B;1C;2D……

前一位数字表示背景色,后一个字母则为前景。每个数字可以为以下任何值之一:

0 = 黑色

1 = 蓝色

2 = 绿色

3 = 湖蓝色

4 = 红色

5 = 紫色

6 = 黄色

7 = 白色

8 = 灰色

9 = 淡蓝色

A = 淡绿色

B = 淡浅绿色

C = 淡红色

D = 淡紫色

E = 淡黄色

F = 亮白色

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。

2、dir > con

>为输入输出重定向中的一个

输出重定向命令

上面这个命令的意思是将dir的显示结果输出到con设备(显示器)

其实和dir 直接回车后执行的效果是一样的

dir > nul

将dir命令执行的结果输出到nul空设备

即不显示结果(于显示器上)

nul是Dos中的一个设备文件名

表示空设备

CON 控制台(键盘/显示器)

AUX 第一串行通信口

PRN 第一并行通信口/打印机 COM1 第一串行通信口

LPT1 第一并行通信口/打印机 COM2 第一串行通信口

LPT2 第一并行通信口/打印机

3、mode 设置bat窗口的大小

mode con cols=

左右长度 lines=上下长度

Mode con: COLS=41 LINES=18

4、ping /n 6 127.1>nul

在等待5秒后开始运行下面语句

5、Sc config Alerter start= DISABLED 设置你的警报服务为禁止

Sc config PlugPlay start= AUTO

设置即插即用设备服务为自动

6、批处理中显示当前时间日期

echo %date%

date /t

都可以显示当前日期

不同之处:echo %date%

这样日期可以显示在批处理的中间

但是date /t 就不可以

系统及局部变量

%SystemDrive%



操作系统所在的分区号。如 C:

%HOMEDRIVE%

操作系统所在的分区号。如:C:

%SystemRoot%

操作系统根目录。如 C:\WINDOWS

%windir%



操作系统根目录。如 C:\WINDOWS

%ALLUSERSPROFILE%

所有用户文件夹。如C:\Documents and Settings\All Users

%APPDATA%

如:C:\Documents and Settings\用户目录\Application Data

%ProgramFiles%

程序文件夹相当于 C:\Program Files

%CommonProgramFiles% 相当于 C:\Program Files\Common Files

%HOMEPATH%

相当于 \Documents and Settings\用户目录

%USERPROFILE%

相当于 C:\Documents and Settings\用户目录

%UserProfile%

当前用户文件夹

C:\Documents and Settings\Administrator

1%temp%

临时文件夹C:\Documents and Settings\Administrator\Local Settings\Temp

2%SystemRoot%\TEMP

临时文件夹 C:\WINDOWS\Temp

桌面

%USERPROFILE%\桌面

右键菜单“发送到”

%USERPROFILE%\SendTo

收藏夹


%USERPROFILE%\Favorites

快速启动

%APPDATA%\Microsoft\Internet Explorer\Quick Launch

「开始」菜单



%USERPROFILE%\「开始」菜单

%ALLUSERSPROFILE%

返回所有“用户配置文件”的位置。

(C:\Documents and Settings\All Users)

%APPDATA%

返回默认情况下应用程序存储数据的位置。

(C:\Documents and Settings\Administrator\Application Data)

%CD%

返回当前目录字符串。

%CMDCMDLINE%

返回用来启动当前的Cmd.exe 的准确命令行。

("C:\WINDOWS\system32\CMD.exe")

%COMPUTERNAME%

返回计算机的名称。

%COMSPEC%

返回命令行解释器可执行程序的准确路径。

(C:\WINDOWS\system32\cmd.exe)

%DATE%

返回当前日期。使用与 date /t 命令相同的格式。

%ERRORLEVEL%

返回最近使用过的命令的错误代码。通常用非零值表示错误。

%HOMEDRIVE%

返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。

%HOMEPATH%

返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。(\Documents and Settings\Administrator)

%HOMESHARE%

返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在

“本地用户和组”中指定的。

%OS%

返回操作系统的名称。

%PATH%

指定可执行文件的搜索路径。

C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel)

%PATHEXT%

返回操作系统认为可执行的文件扩展名的列表。

(.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH)

%PROMPT%

返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。

%TEMP% and %TMP%

系统和用户

返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。

(C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp)

%TIME%

返回当前时间。使用与 time /t 命令相同的格式

(12:20:05.89)

%USERDOMAIN%

返回包含用户帐户的域的名称。

%USERNAME%

返回当前登录的用户的名称。

%UserPrefix%

返回当前用户的配置文件的位置。

相关文档
最新文档