• 批处理学习


    ----------------------------------------------------------------------------------------------------

    1、@ 

    作用是让执行窗体中不显示执行的命令本身

    2、echo

    意思为反馈,回显,其实是个开关命令。

    另外一个作用:用来显示信息 ,如 :echo 你好吗?

    echo off

    作用:不显示以后各行中的命令本身。

    当使用@echo off:不显示echo off命令本身,不显示以后各行中的命令本身

    与其相对的命令是echo on

    3、>

    表示左侧结果输出到文件

    例如: echo ping 192.68.1.1>a.bat

    4. >> 

    表示左侧结果追加的文件中

    例如:

    echo nbtstat -A 192.168.0.1 > a.bat
    echo nbtstat -A 192.168.0.2 >> a.bat 

    5.  ::

    注释用 与rem等效

    6. pause 

    暂停,让当前程序进程暂停一下,并显示一行信息:请按任意键继续. .

    7. : 和 goto

    goto表示跳转到指定标签,:就是标签的定义

    例如:

    。。。

    goto label1

    。。。

    :label1

    。。。

    8. %

    不是命令,是个参数,%1,%2 分别表示参数1,参数2

    用法:假设有个crearefile.bat脚本内容为:

    ping %1>%2.txt

     则使用时 执行 createfile 192.168.1.1  result

    ------------------------------------------------------------------------------------

    9.  if, 表示判断命令,有三种用法

    可以用if /?查看帮助

    IF [NOT] ERRORLEVEL number do command
    IF [NOT] string1==string2 do command
    IF [NOT] EXIST filename do command 

    (1)输入判断, 如:

    if “%1“==“”  goto uage

    if “%1“==“/?" goto uage

    表示 不等于用 if not

    如:if  not “%1“==“”  goto uage 

    (2) 存在判断

    如: if exist C:Progra~1TencentAD*.gif del C:Progra~1TencentAD*.gif

    不存在:

    if not  exist C:Progra~1TencentAD*.gif del C:Progra~1TencentAD*.gif

    (3) 结果判断

    例如:

    masm %1.asm

    if errorlevel 1 pause &edit a.asm

    link 1.obj

    说明:

    errorlevel 是前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码)

    这里判断errorlevel是否等于1, 等于1则执行 pause &edit a.asm,否则执行link 1.obj

    否定的形式用法:

    masm %1.asm
    if not errorlevel 1 link %1.obj
    pause & edit %1.asm 

    如果不用errorlevel判断返回码,另一写法必须用else写

    masm %1.asm
    if exist %1.obj link %1.obj
    else pause & edit %1.asm 

    10. call

    命令用来从一个批处理脚本中调用另一个批处理脚本

    例如有三个脚本 start.bat、10.bat  、ipc.bat

    start.bat:
    ……
    CALL 10.BAT 0
    ……

    10.bat:
    ……
    ECHO %IPA%.%1 >HFIND.TMP
    ……
    CALL ipc.bat IPCFind.txt

    ipc.bat:
    for /f "tokens=1,2,3 delims= " %%i in (%1) do call HACK.bat %%i %%j %%k 

    注意:示例中%%i, %%j为变量,call也可以自己调用自己

    11. find

    搜索命令,搜索特定字符串,例子:

    @echo off
    netstat -a -n > a.txt
    type a.txt | find "7626" && echo "Congratulations! You have infected GLACIER!"
    del a.txt
    pause & exit 

    说明: type 命令出a.tex 的全部内容 ,在列出的内容中查找7626字符串,找到则提示,否则退出

    12 |

    |命令的作用,就是让前一命令的输出当做后一命令的输入。

    如:help | more

    13.  <

    输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。

    例:sort < list.txt > alphlist.txt

    sort 命令按字母顺序排列文本文件或命令的输出。在此范例中,sort 命令对 List.txt 文件的行进行排序并显示结果,但不更改文件。并将结果存到 Alphlist.txt 文件中。

    >&,将一个句柄的输出写入到另一个句柄的输入中。
    <&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。 

    14.  &
    这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。

    如:copy a.txt b.txt /y & del a.txt

    15 &&

    这个命令可以把它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出错后将不继续执行后面剩下的命令。

    例如:dir c: > a.txt & dir d: >> a.txt (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。

    16  ||
    这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。
    题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例:
    @echo off
    dir s*.exe || exit

    @echo off
    dir s*.exe || exit
    其实这个例子是有破绽的,如果存在那个exe文件,就退出;如果不存在那个exe文件,也退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir s*.exe执行肯定是不成功的,所以就继续执行exit,自然就退出了。那么如何解决题目给出的问题呢?看下例:
    @echo off
    dir s*.exe || echo Didn't exist file s*.exe & pause & exit
    这样执行的结果,就能达到题目的要求,是否存在s*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪而过的窗口,echo就白写了。

    17 for

    循环命令,只要条件符合,它将多次执行同一命令。
    语法:FOR %%variable IN (set) DO command [command-parameters]
    对一组文件中的每一个文件执行某个特定命令。
    %%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。
    command
    指定对每个文件执行的命令。

    command-parameters
    为特定命令指定参数或命令行开关。
    例如一个批处理文件中有一行:
    for %%c in (*.bat *.txt) do type %%c
    则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。

    FOR %%a IN ( C: D: E: F: G: H: ) DO ATTRIB -R -H -S %%aSXS.EXE & DEL /F /Q /A -R -H -S %%aSXS.EXE & ATTRIB -R -H -S %%aAUTORUN.INF & DEL /F /Q /A -R -H -S %%aAUTORUN.INF

    该命令删除根目录下所有SXS.EXE和AUTORUN.INF文件.

     在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。直接在命令行则只需要一个%号。变量名称是区分大小写的,所以 %i 不同于 %I


    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: est %%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
  • 相关阅读:
    USACO 5.5 Twofive
    USACO 5.4 Telecowmunication
    USACO 5.4 Character Recognition
    BZOJ 1001: [BeiJing2006]狼抓兔子
    USACO 5.4 Canada Tour
    USACO 5.3 Big Barn
    USACO 5.3 Network of Schools
    USACO 5.3 Window Area
    2017辽宁冬令营-4.蚂蚁
    2017辽宁冬令营-3.斐波那契
  • 原文地址:https://www.cnblogs.com/karl-F/p/6903276.html
Copyright © 2020-2023  润新知