批处理_处理器批量 - CSDN
批处理 订阅
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同C、Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。有些人认为批处理语言的含义要比上面的描述更广泛,还包括许多软件自带的批处理语言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所内置的批处理语言的功能,用户可通过它们让相应的软件执行自动化操作(例如调整某个资料夹所有 PSD 图档的解析度)。 而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能,这样用户不必写程式就能得到批处理程序。 展开全文
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同C、Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。有些人认为批处理语言的含义要比上面的描述更广泛,还包括许多软件自带的批处理语言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所内置的批处理语言的功能,用户可通过它们让相应的软件执行自动化操作(例如调整某个资料夹所有 PSD 图档的解析度)。 而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能,这样用户不必写程式就能得到批处理程序。
信息
词    意
对某对象进行批量的处理
扩展名
bat
别    名
批处理脚本
中文名
批处理
外文名
Batch
批处理释义
批处理是一种简化的脚本语言,也称作宏。它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND. COM或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序。一般情况下,每条命令占据一行;当然也可以将多条命令用特定符号(如:&;、&&;、|、||等)分隔后写入同一行中;还有的情况就是像if、for等较高级的命令则要占据几行、几十甚至几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。 [1] 
收起全文
  • windows批处理教程

    2018-10-22 21:38:05
    教程共7个课时,批处理(Batch)通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的解释。批处理文件具有.bat或者.cmd的扩展名。为什么我们需要用批处理呢?实际上,在很...
  • 本文是学习bat整理的笔记,由于内容较多,建议结合右侧...cd %~dp0 :进入批处理所在目录 cd %~dp0bin\ :进入批处理所在目录的bin目录 示例 这个示例在win10 x64测试正常 ::作用:以管理员身份安装Apache d: c...

    本文是学习bat整理的笔记,由于内容较多,建议结合右侧文章大纲查看。

    %~dp0[获取当前路径]

    %~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,目录

    cd %~dp0 :进入批处理所在目录

    cd %~dp0bin\ :进入批处理所在目录的bin目录

    示例

    这个示例在win10 x64测试正常

    ::作用:以管理员身份安装Apache
    d:
    cd %~dp0bin\
    httpd.exe -k install -n "Apache24"

    运行结果

    以管理员身份运行 示例.bat ,执行结果如下:

    C:\Windows\system32>d:
    D:\>cd D:\Server\Apache24\bin\
    D:\Server\Apache24\bin>httpd.exe -k install -n "Apache24"

    我的常用命令

    %cd%[执行的路径]

    当前执行的路径,并非目标文件的路径

    taskkill /f /im notepad.exe [终止进程]

    taskkill /?打开帮助

    image

    cmd窗口中文乱码

    在CMD窗口右键/默认值,打开属性选择 “默认代码页为简体中文GBK”,

    image

    获取命令帮助 xxx /?

    遇到记不清楚的命令,但记得名字,就可以键入 命令名 空格 /?就会有详细的该命令的帮助了,比如:ping /?     cd /?

    imageimage

    查看内置命令的帮助信息

    ver /?

    cmd /?

    set /?

    rem /?

    if /?

    echo /?

    goto /?

    for /?

    shift /?

    call /?

    其他常用的命令

    type /?

    find /?

    findstr /?

    copy /?

    一、基础语法

    1.批处理文件是一个“.bat”结尾的文本文件,这个文件的每一行都是一条DOS命令。可以使用任何文本文件编辑工具创建和修改。

    2.批处理是一种简单的程序,可以用 if 和 goto 来控制流程,也可以使用 for 循环。

    3.批处理的编程能力远不如C语言等编程语言,也十分不规范。

    4.每个编写好的批处理文件都相当于一个DOS的外部命令,把它所在的目录放到DOS搜索路径(path)中,即可在任意位置运行。

    5.C:\AUTOEXEC.BAT 是每次系统启动时都会自动运行的,可以将每次启动时都要运行的命令放入该文件中。

    6.大小写不敏感(命令符忽略大小写)

    7.批处理的文件扩展名为 .bat 或 .cmd。

    8.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe来运行该文件。

     

    二、参数

    1) 系统参数

    %SystemRoot% === C:\WINDOWS (%windir% 同样)

    %ProgramFiles% === C:\Program Files

    %USERPROFILE% === C:\Documents and Settings\Administrator (子目录有“桌面”,“开始菜单”,“收藏夹”等)

    %APPDATA% === C:\Documents and Settings\Administrator\Application Data

    %TEMP% === C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同样)

    %APPDATA% === C:\Documents and Settings\Administrator\Application Data

    %OS% === Windows_NT (系统)

    %Path% === %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的设置)

    %HOMEDRIVE% === C: (系统盘)

    %HOMEPATH% === \Documents and Settings\Administrator

    :: 枚举当前的环境变量

    setlocal enabledelayedexpansion

    FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i !%%i!

     

    2) 传递参数给批处理文件

    %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。

    变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用 %1 到 %9 顺序表示。

    Sample:

    call test2.bat "hello" "haha" (执行同目录下的“test2.bat”文件,并输入两个参数)

    在“test2.bat”文件里写:

    echo %1 (打印: "hello")

    echo %2 (打印: "haha")

    echo %0 (打印: test2.bat)

    echo %19 (打印: "hello"9)

     

    三、批处理基本命令

    0. help 命令

    /? 命令

    语法: 命令 /?

    可显示此命令的帮助信息

    Sample: type /? >>tmp.txt (把 type 命令的帮助信息写入到tmp.txt文件里)

    Sample: help type (显示跟“type /?”一样)

     

    1.Echo 命令

    语法: echo [{on|off}] [message]

    ECHO [ON | OFF] 打开回显或关闭回显功能。

    ECHO 显示当前回显设置。

    ECHO [message] 显示信息。

    echo off 表示在此语句后所有运行的命令都不显示命令行本身;默认是on,on时会显示如: C:\文件夹路径>命令行。

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

    Sample: echo off

    Sample: echo hello world (显示出“hello world”)

    Sample: echo Windows Registry Editor Version 5.00 > c:\setupreg.reg (此前还没有 setupreg.reg 这个文件)

    Sample: echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg (追加内容进 setupreg.reg 这个文件)

     

    2.@ 命令

    表示不显示@后面的命令,(在入侵过程中自然不能让对方看到你使用的命令啦)

    @ 与 echo off 相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。

    Sample: @echo off (此语句常用于开头,表示不显示所有的命令行信息,包括此句)

    Sample: @echo please wait a minite...

    Sample: @format X: /q/u/autoset

    (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。)

     

    3.Goto 命令

    语法:goto label (label是参数,指定所要转向的批处理程序中的行。)

    指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。

    label标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号“:”来表示这个字母是标签。

    goto命令就是根据这个冒号来寻找下一步跳到到那里。经常与 if 配合使用,根据不同的条件来执行不同的命令组。

    例题见“5.Pause 命令”

     

    4.Rem 命令

    语法:Rem Message...

    (小技巧:用::代替rem)

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

    Sample:@Rem Here is the description.

     

    5.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 [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]

    参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。

    调用另一个批处理程序,并且不终止父批处理程序。

    如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。

    call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。

    Sample:call="%cd%\test2.bat" haha kkk aaa (调用指定目录下的 test2.bat,且输入3个参数给他)

    Sample:call test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他)

    注:可以调用自身(死循环、递归)

    7.start 命令

    调用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令 来调用。

    入侵常用参数:

    MIN 开始时窗口最小化

    SEPARATE 在分开的空间内开始 16 位 Windows 程序

    HIGH 在 HIGH 优先级类别开始应用程序

    REALTIME 在 REALTIME 优先级类别开始应用程序

    WAIT 启动应用程序并等候它结束

    parameters 这些为传送到命令/程序的参数

    Sample:start /MIN test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他,且本窗口最小化)

    Sample:e:\"program files"\极品列车时刻表\jpskb.exe (文件路径名有空格时)

    8.If 命令

    if 表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:

    1) IF

    语法: if [not] "参数" == "字符串" 待执行的命令

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

    Sample: if "%1" == "a" format a:

    Sample: if {%1} == {} goto noparms

    2) if exist

    语法: if [not] exist [路径\]文件名 待执行的命令

    如果有指定的文件,则条件成立,运行命令,否则运行下一句。

    Sample: if exist config.sys edit config.sys (表示如果存在这文件,则编辑它,用很难看的系统编辑器)

    Sample: if exist config.sys type config.sys (表示如果存在这文件,则显示它的内容)

    3) if errorlevel number

    语法: if [not] errorlevel <数字> 待执行的命令

    如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。(返回值必须按照从大到小的顺序排列)

    Sample:

    @echo off

    XCOPY F:\test.bat D:\

    IF ERRORLEVEL 1 (ECHO 文件拷贝失败

    ) Else IF ERRORLEVEL 0 ECHO 成功拷贝文件

    pause

    很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。

    常见的返回码为0、1。通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。

    4) else

    语法: if 条件 (成立时执行的命令) else (不成立时执行的命令)

    如果是多个条件,建议适当使用括号把各条件包起来,以免出错。

    Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )

    注:如果 else 的语句需要换行,if 执行的行尾需用“^”连接,并且 if 执行的动作需用(括起来),否则报错

    Sample: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^

    else (echo comment3 )

    5) 比较运算符:

    EQU - 等于 (一般使用“==”)

    NEQ - 不等于 (没有 “!=”,改用“ if not 1==1 ”的写法)

    LSS - 小于

    LEQ - 小于或等于

    GTR - 大于

    GEQ - 大于或等于

     

    9.choice 命令

    choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,

    然后配合 if errorlevel 选择运行不同的命令。

    注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。

    choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。

    使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……

    Sample: choice /c:dme defrag,mem,end

    将显示: defrag,mem,end[D,M,E]?

    Sample:

    choice /c:dme defrag,mem,end

    if errorlevel 3 goto defrag (应先判断数值最高的错误码)

    if errorlevel 2 goto mem

    if errotlevel 1 goto end

    10.for 命令

    for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。

    1) for {%variable | %%variable} in (set) do command [command-parameters]

    %variable 指定一个单一字母可替换的参数。变量名称是区分大小写的,所以 %i 不同于 %I

    在批处理文件中使用 FOR 命令时,指定变量建议用 %%variable而不要用 %variable。

    (set) 指定一个或一组文件。可以使用通配符。

    command 指定对每个文件执行的命令。

    command-parameters 为特定命令指定参数或命令行开关。

    2) 如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:

    a.FOR /D %variable IN (set) DO command [command-parameters]

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

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

    检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。

    如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

    c.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)。

    d.有或者没有 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

    参数"options"为:

    eol=c - 指一个行注释字符的结尾(就一个,如“;”)

    skip=n - 指在文件开始时忽略的行数。

    delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。

    tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。

    m-n格式为一个范围。通过 nth 符号指定 mth。

    如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。

    usebackq - 指定新语法已在下类情况中使用:

    在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。

    3) Sample:

    1. 如下命令行会显示当前目录下所有以bat或者txt为扩展名的文件名。

    for %%c in (*.bat *.txt) do (echo %%c)

    a. 如下命令行会显示当前目录下所有包含有 e 或者 i 的目录名。

    for /D %%a in (*e* *i*) do echo %%a

    b. 如下命令行会显示 E盘test目录 下所有以bat或者txt为扩展名的文件名。

    for /R E:\test %%b in (*.txt *.bat) do echo %%b

    for /r %%c in (*) do (echo %%c) :: 遍历当前目录下所有文件

    c. 如下命令行将产生序列 1 2 3 4 5

    for /L %%c in (1,1,5) do echo %%c

    d. 以下两句,显示当前的年月日和时间

    For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j年%%k月%%l日

    For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo %%j时%%k分

    e. 把记事本中的内容每一行前面去掉8个字符

    setlocal enabledelayedexpansion

    for /f %%i in (zhidian.txt) do (

    set atmp=%%i

    set atmp=!atmp:~8!

    if {!atmp!}=={} ( echo.) else echo !atmp!

    )

    :: 读取记事本里的内容(使用 delims 是为了把一行显示全,否则会以空格为分隔符)

    for /f "delims=" %%a in (zhidian.txt) do echo.%%a

    4) continue 和 break

    利用 goto 实现程序中常用的 continue 和 break 命令, 其实非常简单

    continue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可

    break: 在 for 循环的外面的下一句写上一个标签,跳转到这位置即可

    Sample: (伪代码)

    for /F ["options"] %variable IN (command) DO (

    ... do command ...

    if ... goto continue

    if ... goto break

    ... do command ...

    :continue

    )

    :break

     

    四、其它命令

    1. ping 命令

    测试网络联接状况以及信息包发送和接收状况。但是不能够测试端口。

    语法:ping IP地址或主机名 [-t] [-a] [-n count] [-l size]

    参数含义:

    -t 不停地向目标主机发送数据;

    -a 以IP地址格式来显示目标主机的网络地址;

    -n count 指定要Ping多少次,具体次数由count来指定;

    -l size 指定发送到目标主机的数据包的大小。

    Sample: ping 192.168.0.1 -t (不停的测试192.168.0.1,按ctrl+c停止)

    Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域网电脑)

    2. telnet 命令

    测试端口使用 telnet IP地址或主机名 端口,使用tcp协议的

    Sample: telnet 192.168.0.1 80 (测试192.168.0.1的80端口)

    3.color 命令

    设置背景及字体颜色

    语法: color bf

    b 是指定背景色的十六进制数字; f 指定前景颜色(即字体颜色)。

    颜色值: 0:黑色 1:蓝色 2:绿色 3:湖蓝 4:红色 5:紫色 6:** 7:白色

    8:灰色 9:淡蓝 A:淡绿 B:浅绿 C:淡红 D:淡紫 E:淡黄 F:亮白

    如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。

    如果两参数一样,视为无效输入。只有一个参数时,设置字体。

    4. random 命令

    产生随机数(正整数0~)

    5. exit 命令

    结束程序。即时是被调用的程序,结束后也不会返回原程序

    6. shutdown命令

    shutdown -s 关机

    五、字符串处理

    1) 分割字符串,以查看时间为例

    %源字符串:~起始值,截取长度% (起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;

    截取长度如果是负数,表示截取到倒数第几个。)

    "%time%" 显示如:"11:04:23.03" (完整的时间"hh:mm:ss.tt")

    "%time:~0,5%" 显示"hh:mm"(即"11:04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数

    "%time:~0,8%" 显示标准时间格式"hh:mm:ss"(即"11:04:23",前8个字符串)

    "%time:~3,-3%"显示"mm:ss"(即从第4个开始,截去最后3个的字符串)

    "%time:~3%" 显示"04:23.03"(即去掉前4个字符串)

    "%time:~-3%" 显示".tt"(即最后3个字符串)

    上面的字串分割格式,也可以用于其它地方,如目录路径:"%cd:~0,10%"

    2) 替换字符串

    set a="abcd1234"

    echo %a% 显示:"abcd1234"

    set a=%a:1=kk% 替换“1”为“kk”

    echo %a% 显示:"abcdkk234"

    3) 字符串合并

    由于没有直接的字符串合并函数,只能用笨方法了。

    set str1=%str1%%str2% (合并 str1 和 str2)

    4) 计算字符串长度

    没有现成的函数。如下程序利用 goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度。

    set testStr=This is a test string

    :: 将 testStr 复制到str,str 是个临时字符串

    set str=%testStr%

    :: 标签,用于goto跳转

    :next1

    :: 判断str是不是空,如果不是则执行下边的语句

    if not "%str%"=="" (

    :: 算术运算,使num的值自增1,相当于num++或者++num语句

    set /a num+=1

    :: 截取字符串,每次截短1

    set "str=%str:~1%"

    :: 跳转到next1标签: 这里利用goto和标签,构成循环结构

    goto next1

    )

    :: 当以上循环结构执行完毕时,会执行下边的语句

    echo testStr=%testStr%

    echo testStr的长度为:%num%

    5) 截取字符串时,需要传递参数

    直接 echo %args:~%num%,-5% 没办法想要的字符串,需要如下两步

    setlocal enabledelayedexpansion

    echo !args:~%num%,-5!

     

    六、注册表操作

    1) 备份注册表,将[HKEY_LOCAL_MACHINE ... Run]的内容,备份到“c:\windows\1.reg”

    reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg

    reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg

    2) 修改/添加注册表内容

    a.一般的添加或修改

    reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f

    上句解析:“HKCU”是“HKEY_CURRENT_USER”的缩写,不用缩写用全称也可以;

    添加名称为“Java_Home”的变量;类型为“reg_sz”,另一种常见类型是“reg_dword”;值为 D:\Java\jdk1.6.0_07;

    b.使用变量

    set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java

    reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f

    c.如果注册表的名称有空格,或者数据用特殊符号时

    reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f

    传入值为(值用双引号括起来的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"

    reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f

    传入值为(“\”结尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\

    d.增加空的内容

    reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"

    e.添加或修改默认值

    reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f

    这里用“/ve”来代替一般修改时的“/v 变量名”,即可修改默认值了

    3) 删除注册表的内容

    双引号里面的是注册表的目录,下面两句将删除这目录下的所有信息

    reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f

    reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f

    双引号里面的是注册表的目录,下面一句将删除这目录下指定的某个信息

    reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f

    4) 注册表的常用位置

    a.系统启动项:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]

    [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

    example: REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f

    b.系统环境变量:

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

    c.当前用户的环境变量:

    [HKEY_CURRENT_USER\Environment]

    5) 修改注册表之后,结束并重新加载explorer.exe进程,可刷新注册表,令其生效

    taskkill /f /im explorer.exe >nul

    start "" "explorer.exe"

     

    七、系统服务

    1) 停止服务:NET STOP 服务名

    启动服务:NET Start 服务名

    2) 设置启动类型

    自动: SC CONFIG 服务名 START= auto

    手动: SC CONFIG 服务名 START= demand

    已禁用:SC CONFIG 服务名 START= disabled

    附:“START= ”等号后面必须要有一个空格。(start还有boot,system两个值)

    Sample: SC CONFIG Spooler START= demand (打印机加载项,设置成手动,默认自动)

    3) 查看系统服务:start %SystemRoot%\system32\services.msc /s

     

    八、setlocal与变量延迟

    0) 在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。

    另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行。

    example:

    set a=4

    set a=5 & echo %a%

    结果:4

    也可以对这种机制加以利用,如下的变量交换

    example:

    set var1=abc

    set var2=123

    echo 交换前: var1=%var1% var2=%var2%

    set var1=%var2%& set var2=%var1%

    echo 交换后: var1=%var1% var2=%var2%

    1) 启动批处理文件中环境变量的本地化。本地化将持续到出现匹配的 endlocal 命令或者到达批处理文件结尾为止。

    语法: setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}

    enableextension: 启用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

    disableextensions: 禁用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

    enabledelayedexpansion: 启用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

    disabledelayedexpansion: 禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

     

    2) 为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。

    examle:

    setlocal enabledelayedexpansion

    set a=4

    set a=5 & echo !a!

    结果: 5

    变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来

    由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了

    另外,启动变量延迟,“%”的变量还是不变

    example2:

    setlocal enabledelayedexpansion

    for /l %%i in (1,1,5) do (

    set a=%%i

    echo !a!

    )

    结果,打印从1到5;如果不变量延迟,一个变量也没有打印

     

    九、文件处理

    1.删除

    1) 删除一个文件或多个文件

    del /s /q /f d:\test\a.bat

    将直接删除d:\test\a.bat,没有任务提示

    del temp\* /q /f /s

    将直接删除 本目录的 temp 目录的所有文件,没有任务提示

    删除文件的时候可以使用“*”作通配符

    2) 删除一个空目录

    rd /q /s d:\test\log

    将直接删除d:\test\log目录,如果log目录里面有文件将无法删除

    3) 删除一个非空目录 (必须指定目录名称)

    rmdir /q /s d:\test\logs

    必须指定目录名称,不能使用通配符

    /S 除目录本身外,还将删除指定目录下的所有子目录

    /Q 安静模式,带 /S 删除目录树时不要求确认

    无论里面是否有文件或文件夹将全部直接删除

    2.创建目录

    MKDIR [drive:]path

    MD [drive:]path

    路径有空格时,可以用双引号括起来,也可以用 &nbsp; 替代

    实践部分:

    ======================================================================

     

    小摘录:

    1. 调用其他程序时,对文件的大小写不敏感,文件后缀也可忽略

    如:start LeapFTP.exe 与 start leapftp 效果一样,都是运行“LeapFTP.exe”文件

    每行的开头的字符串会自动查找程序来运行,还可用双引号引起来(文件名或目录名含空格时必须用)

    如:"D:\Program Files\Leap FTP.exe"

    "LeapFTP.exe" 可正常运行文件,start "" "LeapFTP.exe" 也可以正常运行文件(注意,第一个参数是窗口显示的标题)

    3. copy C:\test\*.* D:\back (复制C盘test文件夹的所有文件(不包括文件夹及子文件夹里的东西)到D盘的back文件夹)

    4. dir c:\*.* > a.txt (将c盘文件列表写入 a.txt 中)

    5. > 生成文件并写入内容(如果有这文件则覆盖), >> 文件里追加内容

    6. md d:\aa (创建文件夹)

    7. 在命令末尾加上“>NUL 2>NUL”,表示隐蔽返回信息。

    8. 等待用户输入: set /p 变量名=屏幕显示信息。 Sample:set /p pass=请输入密码:

    9. 让用户按回车退出

    小技巧(替代pause),文件的最后一句:set /p tmp=操作结束,请按回车键退出...

    10.设置标题: title JDK安装

    11.设置屏幕显示颜色,如绿色: color 0a

    12.清屏: cls

    13.查看自己的IP:

    for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do set ip=%%i

    echo %ip% (这时的 %ip% 就是自己的IP地址)

     

    14. 修改文件的更新日期

    copy 文件名+,,>nul (修改为当前时间,如果要修改为指定时间,先修改系统时间,再改回系统时间)

    15. 修改文件的后缀名

    ren C:\test\*.jpg *.JPG

    for /r %%c in (*.jpg) do (ren %%c *.JPG) :: 修改当前目录下的所有文件的后缀名,包括子目录的

    16. 修改文件的文件名

    rename test.jpg test2.JPG

    rename *.jpg *.888.JPG

    17. 查看DNS、IP、Mac等

    1) Win98: winipcfg

    2) Win2000以上: Ipconfig /all

    3) NSLOOKUP

    18.查看IP上的共享资源,就可以

    net view 192.168.10.8

    19.共享

    A.查看你机器的共享资源: net share

    B.手工删除共享

    net share 共享资源名称$ /d

    注意$后有空格。

    C.增加一个共享:

    net share mymovie=e:\downloads\movie /users:3

    mymovie 共享成功。 同时限制链接用户数为3人。

    20.打开某网站

    start iexplore.exe http://www.baidu.com

     

    实例

    1. 生成 reg 文件,运行它,再删除它

    echo "更改windows安装文件的路径"

    echo Windows Registry Editor Version 5.00 > c:\setupreg.reg

    echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup] >> c:\setupreg.reg

    echo "ServicePackSourcePath"="D:\\Win2003\\" >> c:\setupreg.reg

    echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg

    :: 写入注册表

    regedit /S c:\setupreg.reg

    :: 删除注册表文件

    del c:\setupreg.reg

     

    2.调用了exe文件,结束后没有关闭,解决方法

    用start命令运行文件,如:

    start LeapFTP.exe 192.168.0.100

     

    3.设置系统环境变量

    :: 有这个环境变量,则不需再设置,直接结束

    if not "%JAVA_HOME%" == "" exit

    :: 设置环境变量的地址

    set inputJavaHome=%cd%\jdk1.6.0_07

    :: 设置环境变量,也可以设置当前用户的变量

    set EnvironmentHome=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

    echo 正在设置环境变量,请稍候......

    reg add "%EnvironmentHome%" /v JAVA_HOME /t reg_sz /d "%inputJavaHome%" /f

    reg add "%EnvironmentHome%" /v ClassPath /t reg_sz /d ".;%%JAVA_HOME%%\lib" /f

    reg add "%EnvironmentHome%" /v Path /t reg_sz /d "%%JAVA_HOME%%\bin;%Path%" /f]

    :: 刷新,令环境变量生效

    taskkill /f /im explorer.exe >nul

    start "" "explorer.exe"

     

    4.隐藏某目录的所有文件及文件夹

    cd /d 要隐藏的目录(如:D:)

    for /f "usebackq delims=" %%A in (`dir /a /b`) do (attrib "%%A" -r +h -s)

     

    5.在批处理中使用密码。密码为admin,输入正确,跳转到next1 ,若输入密码错误3次,则锁屏。。

    @echo off

    set num=0

    :11

    set /p pass=请输入密码:

    if "%pass%"=="admin" goto next1

    set /a num=%num% + 1

    if %num%==3 goto no1

    goto 11

    :no1

    %windir%\system32\rundll32.exe user32.dll,LockWorkStation

    goto 11

    :next1

    echo 密码正确,执行下面的程式

    pause

     

    6.清空回收站(未成功)

    @echo off

    del /f /s /q c:\recycler\*.*

    ::刷新屏幕

    taskkill /f /im explorer.exe >nul

    start "" "explorer.exe"

     

    7.让系统断断续续地鸣叫

    @echo off

    :begin

    :: 发出鸣叫(“”实际就是ASCII码值为7的特殊字符(蜂鸣键beep)

    echo

    :: 让程序暂停一小阵子

    ping -n 1 -l 1 127.1>nul

    goto :begin

    8.将 FAT 卷转换成 NTFS

    利用“CONVERT.exe”进行,解析如下:

    CONVERT volume /FS:NTFS [/V] [/CvtArea:filename] [/NoSecurity] [/X]

    volume 指定驱动器号(后面跟一个冒号)、装载点或卷名。

    /FS:NTFS 指定要被转换成 NTFS 的卷。

    /V 指定 Convert 应该用详述模式运行。

    /CvtArea:filename

    将根目录中的一个接续文件指定为NTFS 系统文件的占位符。

    /NoSecurity 指定每个人都可以访问转换的文件和目录的安全设置。

    /X 如果必要,先强行卸载卷。该卷的所有打开的句柄则无效。

     

    程序如下:

    @ ECHO OFF

    @ ECHO.

    @ ECHO. 说 明

    @ ECHO --------------------------------------------------------------------------

    @ ECHO NTFS是一种磁盘格式。该格式能存放大于4G的单个文件(如高清电影文件),并可对

    @ ECHO 文件夹进行加密,但有个缺点是DOS下无法访问。建议D盘及其后的盘使用NTFS格式,

    @ ECHO C盘如非必要可以不转换,FAT32与NTFS这两种格式的读写速度几乎是没有差别的。

    @ ECHO --------------------------------------------------------------------------

    @ ECHO.

    convert c: /fs:ntfs

    :: D盘也转成 NTFS

    convert d: /fs:ntfs

     

    9. 获取我的文档

    SET SF="HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

    FOR /F "tokens=2,*" %%I IN ('REG QUERY %SF% /v Personal 2^>NUL^|FIND /I "Personal"') DO SET "myDoc=%%~J"

    :: 复制文件到我的文档

    XCOPY /D /E /R /Y /C "%cd%\test.txt" "%myDoc%\test\"

    10 获取当前目录路径

    cd ./

    set CURR_PATH=%cd%

    ==========================================

    实例:

    3.IF-ERRORLEVEL

    @ECHO OFF

    XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败

    IF ERRORLEVEL 0 ECHO 成功拷贝文件

     

    如果文件拷贝成功,屏幕就会显示“成功拷贝文件”,否则就会显示“文件拷贝失败”。

    IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是错误的:

    @ECHO OFF

    XCOPY C:\AUTOEXEC.BAT D:\

    CHO 成功拷贝文件

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

     

    =============================================================

    @echo off //不显示shell的命令。

    Setlocal //环境改变只适用于这个文件。

    %OS% //为当前的操作系统。

    Rem //注释一行文本。

    Goto 标签 //改变执行顺序,去标签位置.

    :标签 //定义一个标签。

    Set 变量名=值 //定义变量

    Not //取反

    Netstat –na //显示当前被点用的端口.

    %0 %1 %2 //用于表示批处理文件的参数0为命令,共1-9个参数。

    Shift //用于向前一个参数,原1变0,原2变1.每调用一次shift向前一移动一位。

    Call //调用其他批处理文件或命令。

    Start 命令 参数 //指示出在另一个窗口中开始运行命令。

    =============================================================

    :: 这段批处理程序可以自动设置Java环境变量

     

    @echo off

    IF EXIST %1\bin\java.exe (

    rem 如输入正确的 Java2SDK 安装目录,开始设置环境变量

    @setx JAVA_HOME %1

    @setx path %path%;%JAVA_HOME%\bin

    @setx classpath %classpath%;.

    @setx classpath %classpath%;%JAVA_HOME%\lib\tools.jar

    @setx classpath %classpath%;%JAVA_HOME%\lib\dt.jar

    @setx classpath %classpath%;%JAVA_HOME%\jre\lib\rt.jar

    @echo on

    @echo Java 2 SDK 环境参数设置完毕,正常退出。

    ) ELSE (

    IF "%1"=="" (

    rem 如没有提供安装目录,提示之后退出

    @echo on

    @echo 没有提供 Java2SDK 的安装目录,不做任何设置,现在退出环境变量设置。

    ) ELSE (

    rem 如果提供非空的安装目录但没有bin\java.exe,则指定的目录为错误的目录

    @echo on

    @echo 非法的 Java2SDK 的安装目录,不做任何设置,现在退出环境变量设置。

    )

    )

     

    可能遇到问题

    中文乱码

    把bat文件的编码改为ANSI,UTF-8在win10我这儿会中文显示乱码

    展开全文
  • 50个经典批处理

    2020-07-30 23:33:22
    50个经典批处理
  • 课程介绍:  本系列视频教程结合具体案例详细讲解了SpringBatch实现批处理的方式,包括Job,Flow,决策器,监听器,ItemReader,ItemWriter,ItemProcessor,JobLauncher,JobOperator。
  • 批处理教程(最全版).pdf
  • 批处理-从零开始(一)

    2019-06-18 14:54:08
    批处理1 认识批处理1.1 命令行简介1.2 批处理简介2 批处理语法规则 1 认识批处理 1.1 命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序; DOS――Disk Operation System ...

    1 认识批处理

    1.1 命令行简介

    命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序;
    DOS――Disk Operation System 磁盘操作系统

    1.2 批处理简介

    批处理文件是指文件后缀名为“.bat”的文件,它的作用是可以一次批量执行大量的命令,可以大大节省命令反复输入的繁琐;

    格式:
    批处理文件起源于DOS时代,在DOS时代的扩展名为.bat(即是batch的缩写),可使用Copy con、Edit、WPS等DOS程序来编辑。经时代的发展,现今批处理文件已经不止支持DOS下的程序,同时也支持Windows环境程序的运行,在Windows NT以后的平台中,还加入以.cmd为扩展名的批处理文件,其性能比.bat文件更加优越,执行也与.bat文件一样方便快捷。
    由于.bat文件是基于16平台下的程序,在Windows NT及以后的32位中运行时偶尔会出现堆栈溢出之类的错误,所以建议在新的系统中尽可能的采用**.cmd扩展的批处理文件代替.bat的文件**

    2 批处理语法规则

    1 echo 和 @回显控制命令
    @ #关闭单行回显
    echo off #从下一行开始关闭回显
    @echo off #从本行开始关闭回显。一般批处理第一行都是这个
    echo on #从下一行开始打开回显
    echo #显示当前是 echo off 状态还是 echo on 状态
    echo. #输出一个"回车换行",一般就是指空白行
    echo hello world #输出hello world
    "关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果批处理开始和结束时,系统都会自动打开

    回显
    2 errorlevel程序返回码

    echo %errorlevel%每个命令运行结束,可以用这个命令行格式查看返回码用于判断刚才的命令是否执行成功默认值为0,

    一般命令执行出错会设 errorlevel 为1

    3 dir显示目录中的文件和子目录列表
    dir #显示当前目录中的文件和子目录
    dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
    dir c: /a:d #显示 C 盘当前目录中的目录
    dir c:\ /a:-d #显示 C 盘根目录中的文件dir d:\mp3 /b/p #逐屏显示 d:\mp3 目录里的文件,只显示文件

    名,不显示时间和大小
    dir *.exe /s显示当前目录和子目录里所有的.exe文件其中 * 是通配符,代表所有的文件名,还一个通配符 ? 代表一个

    任意字母或汉字如 c*.* 代表以 c 开头的所有文件?.exe 代表所有文件名是一个字母的.exe文件如果指定的目录或文件

    不存在,将返回 errorlevel 为1;每个文件夹的 dir 输出都会有2个子目录 . 和 … 代表当前目录… 代表当前目录的

    上级目录
    dir . #显示当前目录中的文件和子目录
    dir … #显示当前目录的上级目录中的文件和子目录
    其它参数可参考 dir /?

    4 cd更改当前目录
    cd mp3 #进入当前目录中的mp3 目录
    cd … #进入当前目录中的上级目录
    cd\ #进入根目录
    cd #显示当前目录
    cd /d d:\mp3 #可以同时更改盘符和目录
    cd “Documents and Settings”\All users文件名带空格,路径前需要加上引号!!如果更改到的目录不存在,则出错返

    回 errorlevel=1

    5 md创建目录
    md abc #在当前目录里建立子目录 abc
    md d:\a\b\c #如果 d:\a 不存在,将会自动创建

    6 rd删除目录
    rd abc #删除当前目录里的 abc 子目录,要求为空目录
    rd /s/q d:\temp #删除 d:\temp 文件夹及其子文件夹和文件,不需要按 Y 确认

    7 del删除文件
    del d:\test.txt #删除指定文件,不能是隐藏、系统、只读文件
    del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认
    del /q/a/f d:\temp*.*删除 d:\temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
    del /q/a/f/s d:\temp*.*删除 d:\temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录

    8 ren文件重命名
    ren 1.txt 2.bak #把 1.txt 更名为 2.bak
    ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件
    ren d:\temp tmp #支持对文件夹的重命名

    9 cls清屏

    10 type显示文件内容
    type c:\boot.ini #显示指定文件的内容,程序文件一般会显示乱码
    type *.txt #显示当前目录里所有.txt文件的内容

    11 copy拷贝文件
    copy c:\test.txt d:\复制 c:\test.txt 文件到 d:
    copy c:\test.txt d:\test.bak复制 c:\test.txt 文件到 d:\ ,并重命名为 test.bak
    copy c:*.*复制 c:\ 所有文件到当前目录,不包括隐藏文件和系统文件不指定目标路径,则默认目标路径为当前目录
    copy con test.txt从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件con代表屏幕,prn代表打印机

    ,nul代表空设备
    copy 1.txt + 2.txt 3.txt合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件如果不指定 3.txt ,则保存到 1.txt
    copy test.txt +复制文件到自己,实际上是修改了文件日期

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

    13 ver显示系统版本

    14 label 和 vol设置卷标
    vol #显示卷标
    label #显示卷标,同时提示输入新卷标
    label c:system #设置C盘的卷标为 system

    15 pause暂停命令
    运行该命令时,将显示下面的消息:请按任意键继续 . . .
    一般用于看清楚屏幕上显示的内容

    16 rem 和 ::注释命令
    注释行不执行操作

    17 date 和 time日期和时间
    date #显示当前日期,并提示输入新日期,按"回车"略过输入
    date/t #只显示当前日期,不提示输入新日期
    time #显示当前时间,并提示输入新时间,按"回车"略过输入
    time/t #只显示当前时间,不提示输入新时间

    18 goto 和 :跳转命令
    :label #行首为:表示该行是标签行,标签行不执行操作
    goto label #跳转到指定的标签那一行

    19 find (外部命令)查找命令
    find “abc” c:\test.txt在 c:\test.txt 文件里查找含 abc 字符串的行如果找不到,将设 errorlevel 返回码为1
    find /i “abc” c:\test.txt查找含 abc 的行,忽略大小写
    find /c “abc” c:\test.txt显示含 abc 的行的行数

    20 more (外部命令)逐屏显示
    more c:\test.txt #逐屏显示 c:\test.txt 的文件内容

    21 tree显示目录结构
    tree d:\ #显示D盘的文件目录结构

    22 &顺序执行多条命令,而不管命令是否执行成功
    c: & cd\ & dir /w相当于把下面3行命令写到1行去了c:cd\dir /w

    23 &&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
    f: && cd\ && dir >c:\test.txt注意如果f盘不存在,那么后面2条命令将不会执行
    find “ok” c:\test.txt && echo 成功如果找到了"ok"字样,就显示"成功",找不到就不显示

    24 ||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

    find “ok” c:\test.txt || echo 不成功如果找不到"ok"字样,就显示"不成功",找到了就不显示

    25 |管道命令
    前一个命令的执行结果输出到后一个命令
    dir . /s/a | find /c ".exe"管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令该命令行结果:

    输出当前文件夹及所有子文件夹里的.exe文件的个数
    type c:\test.txt|more这个和 more c:\test.txt 的效果是一样的

    26 > 和 >>输出重定向命令

    清除文件中原有的内容后再写入>> 追加内容到文件末尾,而不会清除原有的内容主要将本来显示在屏幕上的内容输出

    到指定文件中指定文件如果不存在,则自动生成该文件
    echo hello world>c:\test.txt生成c:\test.txt文件,内容为hello world这个格式在批处理文件里用得很多,可以生成

    .reg .bat .vbs 等临时文件
    type c:\test.txt >prn屏幕上不显示文件内容,转向输出到打印机
    echo hello world>con在屏幕上显示hello world,实际上所有输出都是默认 >con 的
    copy c:\test.txt f: >nul拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
    copy c:\test.txt f: >nul 2>nul不显示"文件复制成功"的提示信息,并且f盘不存在的话,也不显示错误提示信息
    echo ^^W ^> ^W>c:\test.txt生成的文件内容为 ^W > W^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^

    符号
    27 <从文件中获得输入信息,而不是从屏幕上
    一般用于 date time label 等需要等待输入的命令
    @echo offecho 2005-05-01>temp.txtdate <temp.txtdel temp.txt这样就可以不等待输入直接修改当前日期

    %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %命令行传递给批处理的参数
    %0 批处理文件本身%1 第一个参数%9 第九个参数%
    从第一个参数开始的所有参数在C盘根目录新建test.bat,内容如下:
    @echo off
    echo %0
    echo %1
    echo %2
    echo %*
    复制代码
    运行cmd,输入 c:\test.bat “/a” /b /c /d可以看出每个参数的含意
    修改test.bat内容如下
    @echo off
    echo %1
    echo %~1
    echo %0
    echo %~f0
    echo %~d0
    echo %~p0
    echo %~n0
    echo %~x0
    echo %~s0
    echo %~a0
    echo %~t0
    echo %~z0
    复制代码
    再运行cmd,输入 c:\test.bat “/a” /b /c /d可以参照 call/? 或 for/? 看出每个参数的含意注意这里可以对文件进行日期比较和大小比较
    echo load “%%1” “%%2”>c:\test.txt
    复制代码
    生成的文件内容为 load “%1” “%2”
    批处理文件里,用这个格式把命令行参数输出到文件

    31 set设置变量
    引用变量可在变量名前后加 % ,即 %变量名%
    set #显示目前所有可用的变量,包括系统变量和自定义的变量
    echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
    set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
    set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
    echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
    echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
    echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
    echo %p:~0,3% #显示前3个字符,即aa1
    echo %p:~-2% #显示最后面的2个字符,即b2
    echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
    echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
    echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
    echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
    set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
    set /a p=39 #设置p为数值型变量,值为39
    set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3set /a p=p/10 #用 /a

    参数时,在 = 后面的变量可以不加%直接引用set /a p=“1&0” #"与"运算,要加引号。其它支持的运算符参见

    set/?
    set p= #取消p变量
    set /p p=请输入屏幕上显示"请输入",并会将输入的字符串赋值给变量p注意这条可以用来取代 choice 命令
    注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
    @echo off
    set p=aaa
    if %p%==aaa (
    echo %p%
    set p=bbb
    echo %p% )
    结果将显示aaaaaa因为在读取 if 语句时已经将所有 %p% 替换为aaa这里的"替换",在 /? 帮助里就是指"扩充"、"环境

    变量扩充"可以启用"延缓环境变量扩充",用 ! 来引用变量,即 !变量名!
    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    set p=aaaif %p%==aaa (
    echo %p%
    set p=bbb
    echo !p! )
    ENDLOCAL
    结果将显示aaabbb
    还有几个动态变量,运行 set 看不到
    %CD% #代表当前目录的字符串
    %DATE% #当前日期
    %TIME% #当前时间
    %RANDOM% #随机整数,介于0~32767
    %ERRORLEVEL% #当前ERRORLEVEL 值
    %CMDEXTVERSION% #当前命令处理器扩展名版本号
    %CMDCMDLINE% #调用命令处理器的原始命令行可以用echo命令查看每个变量值,如 echo %time%注意 %time%

    精确到毫秒,在批处理需要延时处理时可以用到

    32 start批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
    start explorer d:\调用图形界面打开D盘
    @echo offcd /d %~dp0regedit /s 劲舞团.regstart patcher.exe
    不加 start 命令的话,"劲舞团"运行时,后面会有个黑乎乎的cmd窗口

    33 call批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行有时有的应用程序用start调用出错的

    ,也可以call调用

    34 choice (外部命令)选择命令让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……win98里

    是choice.comwin2000pro里没有,可以从win98里拷过来win2003里是choice.exechoice /N /C y /T 5 /D y>nul延时5秒

    下面是个 choice 语句的例子
    @echo off
    rem 以下在win2000pro运行通过,从win98里拷的chioce.com文件
    choice /c:abc aaa,bbb,ccc
    if errorlevel 3 goto ccc
    if %errorlevel%2 goto bbb
    if errorlevel
    1 goto aaa
    rem 必须先判断数值高的返回码rem 可以看到 errorlevel 值的判断有3种写法,有时某种写法不好用,可以用另外的写法
    rem 直接运行

    chioce相当于运行
    choice /c:yn:aaa
    echo aaa
    goto end
    :bbb
    echo bbb
    goto end
    :ccc
    echo ccc
    goto end
    :end

    35 assoc 和 ftype文件关联assoc 设置’文件扩展名’关联,关联到’文件类型’ftype 设置’文件类型’关联,关联到’执行程序和参数’当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开而是先判断.txt属于 txtfile ‘文件类型’再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1可以在"文件夹选项"→"文件类型"里修改这2种关联
    assoc #显示所有’文件扩展名’关联
    assoc .txt #显示.txt代表的’文件类型’,结果显示 .txt=txtfile
    assoc .doc #显示.doc代表的’文件类型’,结果显示 .doc=Word.Document.8
    assoc .exe #显示.exe代表的’文件类型’,结果显示 .exe=exefile
    ftype #显示所有’文件类型’关联
    ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %* assoc .txt=Word.Document.8设置.txt为word类型的文档,可以看到.txt文件的图标都变了
    assoc .txt=txtfile恢复.txt的正确关联 ftype exefile="%1" %*恢复 exefile 的正确关联

    如果该关联已经被破坏,可以运行 command.com ,再输入这条命令

    36 pushd 和 popd切换当前目录
    @echo off
    c: & cd\ & md mp3 #在 C:\ 建立 mp3 文件夹
    md d:\mp4 #在 D:\ 建立 mp4 文件夹
    cd /d d:\mp4 #更改当前目录为 d:\mp4
    pushd c:\mp3 #保存当前目录,并切换当前目录为 c:\mp3
    popd #恢复当前目录为刚才保存的 d:\mp4一般用处不大,在当前目录名不确定时,会有点帮助

    32 subst (外部命令)映射磁盘。
    subst z: \server\d #这样输入z:就可以访问\server\d了
    subst z: /d #取消该映射
    subst #显示目前所有的映

    38 xcopy (外部命令)文件拷贝
    xcopy d:\mp3 e:\mp3 /s/e/i/y复制 d:\mp3 文件夹、所有子文件夹和文件到 e:\ ,覆盖已有文件加 /i 表示如果 e:\ 没有 mp3 文件夹就自动新建一个,否则会有询问

    39 一些不常用的内部命令

    & 将一个句柄的输出写入到另一个句柄的输入中
    <& 从一个句柄读取输入并将其写入到另一个句柄输出中shift 命令行传递给批处理的参数不止9个时,用以切换参数color 设置cmd窗口的显示颜色
    pormpt 更改命令提示符号,默认都是 盘符:\路径> ,如 c:>

    40 format (外部命令)格式化硬盘
    format c: /q/u/autotest/q表示快速格式化,/autotest表示自动格式化,不需要按 Y 确认/u表示每字节用

    F6 覆盖硬盘数据,使其不可用软件恢复format c: /c格式化C盘,并检测坏道

    41 fdisk (外部命令)硬盘分区win2000不带

    该命令win98里的fdisk不支持80G以上大硬盘,winme里的支持fdisk/mbr重建硬盘分区表,一般用于清除引导区病毒、还

    原精灵注意使用该命令不能从硬盘启动,必须软驱或光驱启动后直接运行

    42 ping (外部命令)
    ping -l 65500 -t 192.168.1.200不停的向192.168.1.200计算机发送大小为65500byte的数据包
    ping -n 10 127.0.0.1>nulping自己10次,可用于批处理延时10秒

    43 SC (外部命令)服务控制命令
    sc create aaa displayname= bbb start= auto binpath= “C:\WINDOWS\System32\alg.exe"创建服务,服务名称aaa,显示名称bbb,启动类型:自动可执行文件的路径"C:\WINDOWS\System32\alg.exe”
    sc description aaa "ccc"更改aaa的描述为ccc
    sc config aaa start= disabled binpath= “C:\WINDOWS\System32\svchost.exe -k netsvcs"更改aaa的启动类型:已禁用更改aaa的可执行文件的路径"C:\WINDOWS\System32\svchost.exe -k netsvcs”
    sc config aaa start= demand displayname= ddd更改aaa的启动类型:手动更改aaa的显示名称ddd
    sc start aaa启动aaa服务
    sc stop aaa停止aaa服务
    sc delete aaa删除aaa服务

    原链接:http://bbs.bathome.net/thread-39-1-1.html

    展开全文
  • 第一章 批处理基础第一节 常用批处理内部命令简介批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。小知识:可以在键盘上按...

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

    批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为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

    9、find
    在文件中搜索字符串。
    FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
       /V        显示所有未包含指定字符串的行。
       /C        仅显示包含字符串的行数。
       /N        显示行号。
       /I        搜索字符串时忽略大小写。
       /OFF[LINE] 不要跳过具有脱机属性集的文件。
       "string"   指定要搜索的文字串,
       [drive:][path]filename
             指定要搜索的文件。
    如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
    Find常和type命令结合使用
    Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
    Type [drive:][path]filename | find /v "string" #剔除文件中包含string的行
    Type [drive:][path]filename | find /c #显示文件行数 
    以上用法将去除find命令自带的提示语(文件名提示)

    例:
    @echo off
    echo 111 >test.txt
    echo 222 >>test.txt
    find "111" test.txt
    del test.txt
    pause
    运行显示如下:
    ---------- TEST.TXT
    111
    请按任意键继续. . .

    例:
    @echo off
    echo 111 >test.txt
    echo 222 >>test.txt
    type test.txt|find "111" 
    del test.txt
    pause
    运行显示如下:
    111
    请按任意键继续. . .

    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、>   重定向符
    输出重定向命令
    DOS的标准输入输出通常是在标准设备键盘和显示器上进行的,利用重定向,可以方便地将输入输出改向磁盘文件或其它设备。其中: 
    1.大于号“>”将命令发送到文件或设备,例如打印机>prn。使用大于号“>”时,有些命令输出(例如错误消息)不能重定向。
    2.双大于号“>>”将命令输出添加到文件结尾而不删除文件中已有的信息。
    3.小于号“<”从文件而不是键盘上获取命令所需的输入。
    4.>&符号将输出从一个默认I/O流(stdout,stdin,stderr)重新定向到另一个默认I/O流。
    例如,command >output_file 2>&1将处理command过程中的所有错误信息从屏幕重定向到标准文件输出中。标准输出的数值如下所示:
    命令重定向的标准句柄

     

     句柄名称
    说明
    STDIN0标准输入,发送自键盘
    STDUOT1标准输出,发送到命令Shell窗口
    STDERR2标准错误输出,发送到命令Shell窗口
    UNDEFINED3~9特定于应用程序的句柄

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

    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盘存在,有错误提示,但命令仍会执行。

    规则:(我是在操作系统是XP SP3,英文版下测试的)
    1.如果目标路径不存在,则整个语句都不执行,例如dir c:\;c:\dfdfdf\a.txt,则根本不会执行,因为我没有c:\dfdfdf\这个目录;
    2.如果路径存在,仅文件不存在,则会继续执行,并且提示文件不存在的错误,例如:dir c:\;c:\temp\a.txt,我的目录中有c:\temp\文件夹,但这个目录下面没有1.txt这个文件。
    就说这些了!各位有什么意见请回贴!有什么疑问请到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          - 指在文件开始时忽略的行数,(备注:最小为1,n可以大于文件的总行数,默认为1。)
            delims=xxx      - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
            tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                              的 for 本身。这会导致额外变量名称的分配。m-n
                              格式为一个范围。通过 nth 符号指定 mth。如果
                              符号字符串中的最后一个字符星号,
                              那么额外的变量将在最后一个符号解析之后
                              分配并接受行的保留文本。经测试,该参数最多
                              只能区分31个字段。(备注:默认为1,则表示只显示分割后的第一列的内容,最大是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则会把他所在绝对路径打印出来,没有就打印一个错误!

    好了,FOR的的变量就介绍到这了!
                                   

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

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

    %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)
    但这种写法不适合命令太多或嵌套命令的使用。注意:else必须和if在同一行,或者和if最后的括号在同一行,如: ......) ELSE (......。在括号那换行程序认为是一条语句。


    三、循环语句

    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
    goto :eof

    :sub
    set %1=你好
    goto :eof
    运行结果:你好



    子程序例2:设计一个求多个整数相加的子程序
    @echo off
    set sum=0
    call :sub 10 20 35 40 50
    echo 数据求和结果:%sum%
    pause
    goto :eof

    :sub
    rem 参数1为返回变量名称
    set /a sum+=%1
    shift /1 
    if not "%1"=="" goto sub
    goto :eof

    运行结果:155

    五、用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) 




    七、调用VBScript程序

    使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。

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

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




    八、将批处理转化为可执行文件

    由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.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 WScript.Sleep %1>delay.vbs
    CScript //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 10
    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”是输出每个“■”的时间间隔,ping /n 0表示不执行这个命令,所以会比ping出去的时间更短,也就是即每隔多少时间最短输出一个“■”。当然你也可以改为1或2或3等使时间延长

    PS:上面的代码执行太快了,并且第一个出现的节奏和后面的不协调,我稍微修改了点,如下:
    echo.
    echo ┌──────────────────────────────────────┐
    ping 127.0.0.1 >nul /n 1 & set /p=<nul 
    for /L %%i in (1 1 39) do set /p a=■<nul & ping /n 1 127.0.0.1>nul
    echo   100%%
    echo └──────────────────────────────────────┘
    pause

     

    十一、特殊字符的输入及应用

    开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。

    (如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)

    以上是特殊字符的输入方法,选自[英雄]教程,很管用的。也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。

    一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。
    例:
    C:>ECHO ^G>temp.txt
    “^G”是用Ctrl+G或Alt+007输入(按住Alt后,只能按小键盘的数字),输入多个^G可以产生多声鸣响。


    特殊字符的应用也很有意思,这里仅举一例:退格键(输入方法:开始 -> 运行 -> 输入cmd -> edit -> ctrl+p ->退格键)

    退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。

    利用退格键,配合空格覆盖,可以设计闪烁文字效果


    例:文字闪烁,可以使用Ctrl+C组合键来强行终运行
    @echo off
    :start
    set/p=床前明月光<nul
    ::显示文字,光标停于行尾

    ping -n 0 127.0.0.1>nul
    ::设置延迟时间

    set /p a=<nul
    :: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。

    ping -n 0 127.0.0.1>nul
    ::设置延迟时间

    set /p a=                               <nul
    ::输出空格将之前输出的文字覆盖掉。

    set /p a=<nul
    ::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的

    空格数少,否则光标不能退到最左端。

    ping -n 0 127.0.0.1>nul
    ::设置延迟时间

    goto start

    解说:主要是利用set命令的/p,表示后等号面的字符都是提示字符,然后在用退格键,让光标置于该行的最左端,但是原来的文字还在,然后使用空格作为输入提示符,所以就会覆盖前面的文字,然后再次输出退格符将光标置于该行的最左端,循环执行。如果你把ping命令的次数改为4,使延迟增长,就能看到光标的位置变化了。

    例:输出唐诗一首,每行闪动多次
    @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%,求余数运算%%,字符串处理等,可以实现很多随机处理。

    通过上面的学习,我们知道,%random%可以产生0到32767之间的随机数,但是,如何才能得到一定范围内的随机数呢? 
    我们可以使用通用的算法公式如下: 
      通用的公式%random%%%(max-min+1)+min来产生[min,max]区间里的随机数,
    注:批处理中求模得用两个%%符号。 
      比如,我们想获得4到12之间的随机数,就可以这样来使用,代码如下:

    @REM 产生10个[4,12]间的随机数 
    @echo off 
    REM 启用延迟环境变量扩展 
    setlocal enabledelayedexpansion 
    REM 设置随机数的最小和最大值以及求模用的变量 
    set min=4 
    set max=12 
    set /a mod=!max!-!min!+1

    for /l %%i in (1,1,10) do ( 
    REM 产生[min,max]之间的随机数 
    set /a r=!random!%%!mod!+!min! 
    echo. 
    echo 随机数%%i:!r!)

    详细出处参考:http://www.jb51.net/article/36489.htm


    思考题目:生成给定位数的随机密码
    解答思路:将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   ::---生成0-35之间的随即数
    call set return=%return%%%wordset:~%numof%,1%%   ::---在wordset变量中,从的随即生成的0-35的下一个取出一个字符
    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
    请按任意键继续. . .

    展开全文
  • 批处理

    2015-12-14 21:39:53
    本来以为批处理是DOS时代的过时产品,但是在最近学习汇编,以及在分析其它一些程序及脚本语言时,发现好多涉及批处理的东西,表示什么都不知道,今天就把批处理简单的学习了一下,这里简单的总结一下; 1.基本介绍:...

    本来以为批处理是DOS时代的过时产品,但是在最近学习汇编,以及在分析其它一些程序及脚本语言时,发现好多涉及批处理的东西,表示什么都不知道,今天就把批处理简单的学习了一下,这里简单的总结一下;

    1.基本介绍:

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

    2.几种简单的批处理命令:

       echo:

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

    语法

    echo [{on|off}] [message]

    Sample:

    @echo off 

     echo hello world

    在文本编辑器中输入以上命令,然后修改文件格式为xxx.bat,直接点击之后就会在CMD窗口运行显示 hello world   这些语句,关于on和off两个选项需要自己手动运行一下才可以真正体会带他们的不同之处。如下图所示:

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

    rem:关于这个命令仿照一下别人介绍

    注释命令,类似于在C语言中的/*--------*/,它并不会被执行,只是起一个注释的作用,只有在编辑批处理时才会被看到,主要用于方便修改。

    :: 也具有rem的功能

    但::和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。
    但是当打开回显时,rem和rem

    后的内容会显示出来,然而::后的内容仍然不会显示。

    Rem [注释内容]

    sample:

    rem Hello world。

    pause:

    暂停命令。运行 Pause 命令时,将显示下面的消息:

    Press any key to continue. . .(或:请按任意键继续. . .)

    sample:

    @echo off

    echo 下面的样式就是pause命令的功能:

          pause

    如下图所示:


    call:

    从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call
    命令接受用作调用目标的

    标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。

    语法

    call [路径 文件名] [标签]]

    参数

    [Drive:}[Path] FileName

    指定要调用的批处理程序的位置和名称。

    sample:

    @echo off

    echo 我们利用call来调用一下自己电脑上的计算器出来

    call calc.exe

    pause



    start:命令很简单,参数很复杂

    调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。

    如:start calc.exe即可打开Windows的计算器。

    常用参数:

    MIN 开始时窗口最小化

    SEPARATE 在分开的空间内开始 16 位 Windows 程序

    HIGH 在 HIGH 优先级类别开始应用程序

    REALTIME 在 REALTIME 优先级类别开始应用程序

    WAIT 启动应用程序并等候它结束

    parameters 这些为传送到命令/程序的参数

    执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令

    脚本内执行,该新行为则不会发生

    sample:

    @echo off

    echo  下面我们用start命令打开cmd窗口:

    start cmd.exe

    pause

    如下图:



    goto:

    这是个很有意思的命令。。。

    跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。

    语法:goto label (label是参数,指定所要转向的批处理程序中的行。

    sample:

    :1

    start

    goto 1

    运行以上这段命令,就会打开很多个窗口(用来整人相当不错)。这段命令的意思是,先用start命令打开窗口,再用goto 1命令转到1标签,即第一行后面的命令。注意标签名字前面要加上英文的冒号。

    标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:
    用来表示这个字母是标签,goto

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

    这个示例就不截图。。。内存马上爆炸,死机 你懂得

    set:

    显示、设置或删除变量

    显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。

    设置和调用变量:例如set aa=abcd,就是把aa定义为abcd。如果要调用这个变量,就把aa两边加上个百分号。

    例如:

    set aa=abcd

    echo %aa%

    pause

    运行这段命令就会显示“abcd”。

    删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令无实质意义。

    需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。

    set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。

    3.几种批处理符号介绍

        @:

      回显屏蔽符号,表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人
    的硬盘)自然不能让对方看到你使用的命令啦。

    下面是命令前使用@的样式:

    下面是不适用@的样式:



    >,  >>:  <

    重定向符号:

    将输出信息重定向到指定的设备或文件。系统默认输出到显示器

    如:echo aaaaa>a.txt 即可将本在显示器上显示的信息aaaaa输出到文件a.txt中,屏幕上没有任何显示。如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaaaa。

    echo aaaaa>>a.txt 类似于echo aaaaa>a.txt。区别在于:如果a.txt本已存在,>a.txt会擦除a.txt中的原有内容,而>>a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa。a.txt不存在时,二者没有差别。

    <:

    将输入信息来源重定向为指定的设备或文件。系统默认从显示器读取输入信息。

    重定向使用举例:

    @echo off

    echo abcdefg——这是文件a.txt中的信息>a.txt

    echo 请任意输入字符,以回车结束:

    set /p ifo=

    cls

    echo 从屏幕获得的输入信息 

    echo %ifo%

    set /p ifo=<a.txt

    echo  从文件a.txt获得的输入信息 

    echo %ifo%

    pause

    如下图所示:自己可以运行一下体会一下




    |:

    管道符号,将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。

    使用格式为:command_1|command_2

    管道符号使用举例:

    =========================================

    @echo off

    echo aaaa>a.txt

    del /p a.txt

    pause

    =========================================

    @echo off

    echo aaaa>a.txt

    echo y|del /p a.txt

    pause

    =========================================

    对比以上两个批处理执行结果,读者即可明白管道符的用法和效果。

    需要说明的是,上面del命令添加开关/p只是为了让读者明白管道符号的使用方法,实际删除文件时不加/p开关即可实现无提示直接删除。

    如下图不使用管道符:


    如下图使用管道符:


    ^

    转义符,

    特殊符号转化为一般符号,即剥离特殊符号的特殊地位。特殊符号指:| & > <

    比如,如果我们想输出符号“>;”,直接用命令 echo > 是不行的,必须修改为 echo ^>;。其余几个特殊符号类似需要有同样的处理。

    转义字符使用举例:

    =========================================

    @echo off

    echo aaaa>a.txt

    echo 第一句echo执行完毕

    echo aaaa^>a.txt

    echo 第二句echo执行完毕

    pause

    =========================================

    比较上面的两句echo,第一句echo将信息aaaa输出到了文件a.txt,而第二句echo则在直接屏幕上显示出aaaa>a.txt

    如下图所示:



    &;、&&;、||

    逻辑命令符,

    &-它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败;

    &&-当&&;前面的命令成功执行时,执行&&;后面的命令,否则不执行;

    ||-当||前面的命令失败时,执行||后面的命令,否则不执行。



    4.批处理的一些语句结构:


     if语句:

    if语句实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能


    字符串比较

    if语句仅能够对两个字符(串)是否相同、先后顺序进行判断等。其命令格式为:

    IF [not] string1 compare-op string2 command1 [else command2]

    其中,比较操作符compare-op有以下几类:

    == - 等于

    EQU - 等于

    NEQ - 不等于

    LSS - 小于

    LEQ - 小于或等于

    GTR - 大于

    GEQ - 大于或等于

    选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。

    字符串比较示例:

    ===============================================

    @echo off

    set str1=abcd1233

    set str2=ABCD1234

    if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)

    if /i %str1% LSS %str2% (echo str1^<str2) else (echo str1^>=str2)

    echo.

    set /p choice=是否显示当前时间?(y/n)

    if /i not %choice% EQU n echo 当前时间是:%date% %time%

    pause>nul

    ===============================================

    对于最后一个if判断,当我们输入n或N时的效果是一样的,都不会显示时间。如果我们取消开关/i,则输入N时,依旧会显示时间。

    另外请注意一下几个细节:1-echo str1^<str2和echo str1^>=str2;2-echo.。




    结果判断

    masm %1.asm

    if errorlevel 1 pause & edit %1.asm

    link %1.obj

    先对源代码进行汇编,如果失败则暂停显示错误信息,并在按任意键后自动进入编辑界面;否则用link程序连接生成的obj文件,这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相应的操作为pause & edit %1.asm部分)。

    另外,和其他两种用法一样,这种用法也可以表示否定。用否定的形式仍表达上面三句的意思,代码变为:

    masm %1.asm

    if not errorlevel 1 link %1.obj

    pause & edit %1.asm



    for语句:

    for语句可以实现类似于C语言里面的循环结构,当然for语句的功能要更强大一点,通过不同的开关可以实现更多的功能。for语句有多个开关,不同开关将会实现不同的功能。

    1.无开关

    无开关的for语句能够对设定的范围内进行循环,是最基本的for循环语句。其命令格式为:

    FOR %%variable IN (set) DO command

    其中,%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%);set就是需要我们设定的循环范围,类似于C语言里面的循环变量;do后面的command就是循环所执行的命令,即循环体。

    无开关for语句举例:

    ===============================================

    @echo off

    for %%i in (a,"b c",d) do echo %%i

    pause>nul

    ===============================================

    2.开关/L

    含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制。其命令格式为:

    FOR /L %%variable IN (start,step,end) DO command

    其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。

    含开关/L的for语句举例(创建5个文件夹):

    ===============================================

    @echo off

    for /l %%i in (1,2,10) do md %%i

    pause

    ===============================================

    上例将新建5个文件夹,文件夹名称依次为1.3.5.7.9。可以发现,%%i的结束值并非end的值10,而是不大于end的一个数。

    3.开关/F

    含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为:

    FOR /F ["options"] %%variable IN (set) DO command

    其中,set为("string"、'command'、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。

    含开关/F的for语句举例:

    ===============================================

    @echo off

    echo **No Options:

    for /f %%a in ("1,2,10") do echo a=%%a

    echo **Options tokens ^& delims:

    for /f "tokens=1-3 delims=," %%a in ("1,2,10") do echo a=%%a b=%%b c=%%c

    pause

    ===============================================

    @echo off

    echo 本文件夹里面的文件有:

    for /f "skip=5 tokens=3* delims= " %%a in ('dir') do (

    if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b

    pause

    ===============================================

    @echo off

    echo 本文件夹里面的文件有:

    dir>c:\file.txt

    for /f "skip=5 tokens=3* delims= " %%a in (c:\file.txt) do (

    if not "%%a"=="<DIR>" if not "%%b"=="字节" if not "%%b"=="可用字节" echo %%b

    del c:\file.txt

    pause

    ===============================================

    对于后面的两个例子,其中options里面的delims= 是可以删除的,因为只要添加了/F开关系统就将delims的值默认为空格。

    符号字符串中的最后一个字符星号,

    那么额外的变量将在最后一个符号解析之后

    分配并接受行的保留文本。本例中也可以改为4,不过文件名中有空格的文件,只能显示空格以前部分

    同时我们也看到了,for语句的do后面的command也是可以分行的,只需要保证command的左括号和do在同一行就可以了。




    5.最后要加上关于如何调用系统时间:

    @echo off

    echo %date%

    echo %time%

    pause

    调用这两个变量,可以直接显示系统当前的时间。












    展开全文
  • 常见批处理命令

    2018-05-29 16:29:30
    1.列表目录下的内容:dirdir2.重命名文件:ren 文件1 文件2把文件1重名名为文件2:ren setTest.txt setTest.bat3.输出JavaHome环境变量:echo %JAVA_HOME%
  • 最近在写一个批处理,功能是连接手机,从安卓手机sd卡中获取文件传输到PC端,然后在传输到另一个网站,做处理后,返回结果 思路:adb.exe实现手机和PC交互  curl实现bat和网站的交互 批处理语法整理:
  • windows批处理(cmd/bat)编程详解    开始之前先简单说明下cmd文件和bat文件的区别:在本质上两者没有区别,都是简单的文本编码方式,都可以用记事本创建、编辑和查看。两者所用的命令行代码也是共用的,只是cmd...
  • bat批处理的注释语句

    2012-10-29 19:53:26
    写bat批处理也一样,都要用到注释的功能,这是为了程式的可读性 在批处理中,段注释有一种比较常用的方法:  goto start  = 可以是多行文本,可以是命令  = 可以包含重定向符号和其他特殊字符  = 只要...
  • 前言: 相信有很多小伙伴都比较喜欢使用Command命令来快速的打开或运行程序,但是有些时候命令提示符会和我们...没成想出现了:“不是内部或外部命令,也不是可运行的程序或批处理文件。” 通过各种查各种找,终于...
  • 很多批处理的程序,大部分是对系统的操作,下现是列表 # 压缩文件 E:\Software\Code\BAT\批处理程序代码.rar 批处理程序代码\批处理程序BaT代码集合\BAT收集\C盘防毒批处理.bat 批处理程序代码\批处理程序BaT代码...
  • “‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件” 下面就讲讲解决方法 解决过程 根据探究的情况来看,这里其实是没有安装好(或者是安装了之后但是在环境变量上却没有设置好) 第一...
  • 今天本来想安装库来着,但是苦于pycharm的设置里不知道出了什么原因,无奈只能使用PIP功能来安装库了,但是输入PIP的时候发现 'PIP' 不是内部或外部命令,也不是可运行的程序或批处理文件,那这个问题该怎么解决呢?...
  • SpringBatch批处理框架

    2020-06-30 23:30:03
    资源名称:Spring Batch 批处理框架内容简介:《Spring Batch 批处理框架》全面、系统地介绍了批处理框架Spring Batch,通过详尽的实战示例向读者展示了Spring Batch框架对大数据批处理的基本开发能力,并对框架的...
  • 资源名称:Windows批处理初级入门视频教程【18讲】资源目录:【】01.批处理入门(一)【】02.批处理入门(二)【】03.批处理入门(三)【】04.批处理之Telnet【】05.批处理之DHCP(一)【】06.批处理之DHCP(二)...
  • ‘python’ 不是内部或外部命令,也不是可运行的程序或批处理文件。我将python安装在D盘之后,输入python,显示如下问题D:\>python 'python' 不是内部或外部命令,也不是可运行的程序 或批处理文件。这个问题本质...
  • 批处理的介绍 扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你...
1 2 3 4 5 ... 20
收藏数 235,168
精华内容 94,067
热门标签
关键字:

批处理