BAT脚本入门
一、概述
首先解决第一个问题,什么是BAT脚本?
- BAT脚本也叫批处理文本,批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们 。 使用批 处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。
- BAT是运行在DOS系统之下,如我们常见的Windows。类似的还有shell脚本,是运行于Linux之下的。
二、BAT脚本常用指令解析
-
echo 命令
功能: 打开回显或关闭请求回显功能,或显示消息
语法: echo [{on|off}] [message]
echo on 表示在此语句后所有运行的命令都显示命令行本身
echo off 表示在此语句后所有运行的命令都不显示命令行本身此两句的作用就是,我们可以选择是否将命令打印到终端上面。
@与echo off相像,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
-
@ 命令
功能: 表示不显示@后面的命令
语法:@{命令}
很多黑客程序在入侵过程中, (例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦 。
example:
@echo off
echo hello world
如此,整个BAT脚本的命令不会在终端显示,但是会在终端打印 "hello world"
-
rem 命令和::命令
功能:表示此命令后的字符为注释,不执行。
语法:放在你想要的注释的命令开头即可
这两条条指令类似于C语言中的注释符"//",留给自己和他人参考使用,写注释等。
example:
@rem there is a warning!!
::there is a warning!!
-
pause 指令
功能:使程序挂起并且输出" Press any key to continue . . . "/如果才中问环境下会提示“请按任意键继续…”
语法:单独使用,放在你想要使程序挂起的地方
example:
@echo off :begin echo I am a iron man pause goto begin
这个例子使用到了类似于C语言中的goto语句的规则。如果你了解该语句可以看出这个脚本是一个死循环,像不像木马程序?
-
goto 命令
功能:跳转到指定标签,找到标签后程序将从下一行开始执行指令。
语法: goto {label }(label是参数,指定所要跳转的位置) ,一般标签前会加":"表示该字母是一个标签,如 “:lable”。
这里不给出例子了,可以参考上一个例子。
-
call 命令
功能:在一个批处理程序中调用另一个批处理程序,并且不终止父批处理程序。call 命令接收用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法: call [Drive:][Path] FileName [BatchParameters] [:label [arguments]
[Drive:][Path] FileName : 指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名,即只能调用批处理程序。
-
start 命令
功能: 调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用
语法:start [Path] FileName
如:start C:\user\test.exe
前面提到call命令只能调用另一个BAT脚本程序,而start则可以调用任何可执行程序。
-
choice 命令
功能: choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,二者之间无空格。它的返回码为1234……
语法: choice /lable:abc [tag1],[tag2],[tag3]
choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法
参数列表:
/C choices 指定要创建的选项列表。默认列表是 “YN”。/N 在提示符中隐藏选项列表。提示前面的消息得到显示,
选项依旧处于启用状态。/CS 允许选择分大小写的选项。在默认情况下,这个工具
是不分大小写的。/T timeout 做出默认选择之前,暂停的秒数。可接受的值是从 0
到 9999。如果指定了 0,就不会有暂停,默认选项
会得到选择。/D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选
项指定的一组选择中; 同时,必须用 /T 指定 nnnn。/M text 指定提示之前要显示的消息。如果没有指定,工具只
显示提示。/? 显示帮助消息。
注意:
ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。
example:
@echo off choice /C dme /M "defrag,mem,end" if errorlevel 3 goto end if errorlevel 2 goto mem if errotlevel 1 goto defrag :defrag c:\dos\defrag goto end :mem mem goto end :end echo good bye
此批处理运行后,将显示“defrag,mem,end[D,M,E]?” ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。
-
if 命令
功能: 表示将判断是否符合规定的条件,从而决定执行不同的命令
语法:其语法有以下三种形式
-
if “参数” == “字符串” 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。
例:if “%1”==“a” format a:
-
if [not] exist [路径]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如: if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文件,则显示它的内容。此处type指令用于显示指定文件的内容。 -
if errorlevel <数字> 待执行的命令
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
其实这个更像一个出错处理机制,我们应在自己编写BAT脚本中多多使用这一形式。
常和if搭配的几个运算符:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
-
-
for 命令
功能: for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
语法: FOR (%%variable|%variable) IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数,指定变量请用%%variable。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。
-
set 命令
语法:set [varible=[string]]
功能:显示、设置或删除环境变量
example:
set VAR=before if "%VAR"=="before"( set VAR==after if "!VAR"=="after"@echo if you see this it work )
通过上面常用的10来个指令的介绍,我们在看大部分的BAT脚本的时候已经没有啥太大的压力了。但是要想更好的掌握BAT脚本,还有以下几点补充:
三、BAT批处理文件参数
-
同Linux中shell脚本一样,BAT脚本也可以使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。 当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。
example:
@echo off
type %1
-
将该脚本命名为type.bat,放在C盘的根目录下,那么当我们执行如下指令:C:>type a.txt
%1就表示a.txt , %0就表示type本身。该指令就表示显示a.txt的内容。
将上面的例子修改一下:
@echo off
type %1
format %2
-
运行指令:C:>type a.txt D:\test
上面这条例子,根据前面讲到的东西我们很容易就可以看出它的含义。
四、使用组合命令
- 组合命令主要用到以下几种符号,利用组合命令我们可以将多条命令进行组合。从而提高脚本编写的灵活度和效率。
-
&
用法: 第一条命令 & 第二条命令 [& 第三条命令…]
描述: 用这种方法可以同时执行多条命令,而不管命令是否执行成功 ,都继续往下继续执行,这个要和&&进行区分。
-
&&
用法: 第一条命令 && 第二条命令 [&& 第三条命令…]
描述: 用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令
example:
@format a.txt && type b.txt
-
||
用法: 第一条命令 || 第二条命令 [|| 第三条命令…]
描述: 用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
这个方法就像我们在测试设备能否识别我们的某个指令,为了保险起见我们设置了多个指令,以确保我们的指令总有一个能被设备执行。
五、管道命令
- 同Linux下环境一样DOS下的BAT脚本中也可使用管道命令
-
| 命令
用法: 第一条命令 | 第二条命令 [| 第三条命令…]
描述:将第一条命令的结果作为第二条命令的参数来使用
-
>、>>输出重定向命令
描述: 将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。
管道命令在我们实际使用中很有用的,大家可慢慢体会。
example:
@echo off @echo hello > c:hello.txt @echo hello > c:welcome.txt @echo welcome >> c:welcome.txt
此时我们会发现在hello.txt中,只有hello这一字符串,没有其他的内容,因为其他的内容都被清空了。
在welcome.txt中,发现除了hello还有welcome。如此可体会一下二者的区别。
-
<、>&、<&
< 从文件中而不是从键盘中读入命令输入。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读取输入并将其写入到另一个句柄输出中。这几个还是很好理解的,可以写几个例子体会一下。
六、重定向操作
- 介绍了管道操作就不得不介绍一下重定向操作。
- 可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到其他位置。输入或输出数据流的位置称为句柄。
- 下表是常见的句柄:
句柄 | 句柄的数字代号 | 描述 |
---|---|---|
STDIN | 0 | 键盘输入 |
STDOUT | 1 | 输出到命令提示符窗口 |
STDERR | 2 | 错误输出到命令提示符窗口 |
UNDEFINED | 3-9 | 句柄由应用程序单独定义,它们是各个工具特有的 |
- 数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序,并对该程序前 10 个句柄中的任何一个句柄进行重定向。要指定要用的句柄,在重定向操作符之前键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置。可以指定文件名或其他现有的句柄。
- 结合前边提到管道知识,我们如果想将错误打印到窗口,可使用如下的指令: 2>&1
七、总结
-
设置字体颜色和窗体大小
设置字体颜色:COLOR 02 (0代表背景色,2代表前景色)
常用的颜色请见下表:
字号 颜色 0 黑色 1 蓝色 2 绿色 3 浅绿色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 浅蓝色 A 潜绿色 B 浅蓝色 C 浅红色 D 浅紫色 E 浅黄色 F 亮白色 设置窗体大小:MODE CON: COLS=宽度 LINES=高度
划重点
-
经过前面的常用命令的介绍,你肯定还是会遇到一些没有见过的命令,没关系送你三招保命的技巧,当你遇到不认识的指令时可使用如下三板斧:
-
[command] help
就会显示该指令的详细信息,使用信息还用例子,当然比我这里讲的要好上很多,还不会出错。这个help就相当于Linux中的man命令。举个例子:set help
-
[command] /?
结合前面讲到的知识,我们可以推出此方法。将想要得到的命令的显示到当前窗口。
-
help
这个指令会显示DOS下常见的指令,如果不懂其用法,可以使用上面两个指令进行查看。可以去自己的命令行敲下该指令看看,下面截了个图:
好啦,暂时就只有这么多了,如果后面发现还有遗漏的会再将其补充进来。
-