bat命令学习

一:基础语法
    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% 同样)
        %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顺序表示。
        call test2.bat "hello" "world"(执行同目录下的"test2.bat"文件,并输入两个参数)
        在"test2.bat"文件里写:
        echo %1(打印: "hello")
        echo %2(打印: "world")
        echo %0(打印: test2.bat)
        echo %19(打印: "hello"9)
        
三、批处理基本命令
    (1)help 命令(/? 命令)
        语法: 命令 /?(可显示此命令的帮助信息)
        type /? >> type.txt(把type命令的帮助信息写入到tmp.txt文件里)
        help type(显示跟"type /?"一样)
        
    (2)echo 命令
        语法:echo [{on|off}] [message]
        ECHO [ON | OFF]    打开回显或关闭回显功能。
        ECHO    显示当前回显设置。
        ECHO [message]    显示信息。
        echo off 表示在此语句后所有运行的命令都不显示命令行本身,默认是on,on时会显示如:C:\文件夹路径>命令行。
        在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用 ">" ">>" "^")结合来实现输入一些命令到特定格式的文件中。
        @echo off
        echo hello world(显示出"hello world")
        echo Windows Registry Editor Version 5.00 > c:\setupreg.reg(此前还没有setupreg.reg这个文件)
        echo "SourcePath"="D:\\Win2003\\" >> c:\setupreg.reg(追加内容进 setupreg.reg 这个文件)
    
    (3)@ 命令
        表示不显示@后面的命令(在入侵过程中自然不能让对方看到你使用的命令啦)
        @ 与 echo off 相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
        @echo off(此语句常用于开头,表示不显示所有的命令行信息,包括此句)
        @echo please wait a minite...
        
    (4)goto 命令
        语法:goto label(label是参数,指定所要转向的批处理程序中的行。)
        指定跳转到标签行,找到标签行后,程序将处理从下一行开始的命令。
        label标签的名字可以随便起,但是最好是有意义的,字母前必须加个冒号":"来表示这个字母是标签。
        goto命令就是根据这个冒号来寻找下一步跳到到那里,经常与 if 配合使用,根据不同的条件来执行不同的命令组。
    
    (5)rem 命令
        语法:rem Message...(小技巧:用::代替rem)
        注释命令,在C语言中相当与/*...*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和自己日后修改。
        @Rem Here is the description。
        
    (6)pause 命令
        会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续
        @echo off
        :begin
            copy D:\WebService\*.*  D:\tmp\
            echo copy files from D:\WebService to D:\tmp
            pause
        goto begin
        
    (7)call 命令
        语法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
        参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称,FileName参数必须具有.bat或.cmd扩展名。
        调用另一个批处理程序,并且不终止父批处理程序。
        如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。
        call命令接受用作调用目标的标签,如果在脚本或批处理文件外使用call,它将不会在命令行起作用。
        call test2.bat arg1 arg2(调用同目录下的test2.bat,且输入2个参数给他)
        注:可以调用自身(死循环、递归)
        
    (8)start 命令
        调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
        入侵常用参数:
        MIN    开始时窗口最小化
        SEPARATE    在分开的空间内开始16位Windows 程序
        HIGH    在HIGH优先级类别开始应用程序
        REALTIME    在REALTIME 优先级类别开始应用程序
        WAIT    启动应用程序并等候它结束
        parameters    这些为传送到命令/程序的参数
        start /min test2.bat hello world
    
    (9)if 命令
        if表示将判断是否符合规定的条件,从而决定执行不同的命令。
        (a)if
            语法: if [not] "参数" == "字符串" 待执行的命令
            参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句(注意是两个等号)。
            if "%1" == "a" format a:
            if {%1} == {} goto noparms
        
        (b)if exist
            语法: if [not] exist [路径\]文件名 待执行的命令
            如果有指定的文件,则条件成立,运行命令,否则运行下一句。
            if exist config.sys type config.sys(表示如果存在这文件,则显示它的内容)

        (c)if errorlevel number
            语法: if [not] errorlevel <数字> 待执行的命令
            如果程序返回值等于指定的数字,则条件成立,运行命令,否则运行下一句(返回值必须按照从大到小的顺序排列)。
            很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。
            常见的返回码为0、1,通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。
            @echo off
            copy E:\test.bat D:\
            if errorlevel 1 echo 错误了
            if errorlevel 0 echo 成功了           
            pause
            
        (d)else
            语法:if 条件 (成立时执行的命令) else (不成立时执行的命令)
            如果是多个条件,建议适当使用括号把各条件包起来,以免出错。
            @echo off
            if 1==0 (echo 1==0) ^
            else if 1==1 (echo 1==1) ^
            else echo 1==2
            注:如果else的语句需要换行,if执行的行尾需用"^"连接,并且if执行的动作需用(括起来),否则报错。
            
        (e)比较运算符:
             EQU-等于(一般使用"==")
             NEQ-不等于(没有 "!=",改用"if not 1==1"的写法)
             LSS-小于
             LEQ-小于或等于
             GTR-大于
             GEQ-大于或等于
            
    (10)choice 命令
        choice使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,然后配合 if errorlevel 选择运行不同的命令。
        注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
        choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。
        使用时应该加/c 参数,c 后应写提示可输入的字符,之间无空格,它的返回码为1234……
        @echo off
        :begin
            choice /c YNC
            if errorlevel == 3 (echo 您选择了C) ^
            else if errorlevel == 2 (echo 您选择了N) ^
            else echo 您选择了Y
        goto begin
        
    (11)for 命令
        for命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。
        (a)    for {%variable | %%variable} in (set) do command [command-parameters]
            %variable 指定一个单一字母可替换的参数,变量名称是区分大小写的,所以 %i 不同于 %I
            在批处理文件中使用 for 命令时,指定变量建议用 %%variable而不要用 %variable。
            (set) 指定一个或一组文件,可以使用通配符。
            command 指定对每个文件执行的命令。
            command-parameters 为特定命令指定参数或命令行开关。
            
        (b)如果命令扩展名被启用,下列额外的 for 命令格式会受到支持:
            1、for /d %variable in (set) do command [command-parameters]
                如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
            2、for /r [[drive:]path] %variable in (set) do command [command-parameters]
                检查以 [drive:]path 为根的目录树,指向每个目录中的for语句。
                如果在 /r 后没有指定目录,则使用当前目录,如果集仅为一个单点(.)字符,则枚举该目录树。
            3、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)。
            4、有或者没有 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中使用双引号扩起文件名称。
        
        (c)实例
            1、显示当前目录下所有以bat或者txt为扩展名的文件名。
                for %%i in (*.bat *.txt) do echo %%i
                
            2、显示当前目录下所有包含有e的目录名。
                for /d %%i in (*e*) do echo %%i
                
            3、显示 E盘目录下所有以bat为扩展名的文件名。
                for /r E:\ %%i in (*.bat) do echo %%i
                ::显示当前目录下所有以bat为扩展名的文件名
                for /r %%i in (*.bat) do echo %%i
            4、将产生序列 1 2 3 4 5
                for /l %%i in (1, 1, 5) do echo %%i
                ::将产生序列 5 4 3 2 1
                for /l %%i in (5, -1, 1) do echo %%i
            5、显示当前的年月日和时间。
                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分
            6、记事本中的内容每一行前面去掉8个字符。
                setlocal enabledelayedexpansion
                for /f %%i in (test.txt) do (
                    set tmp=%%i
                    set tmp=!tmp:~8!
                    if {!tmp!}=={} ( echo 空了) else (echo !tmp!)
                )
                endlocal
                
        (d)continue 和 break
            利用 goto 实现程序中常用的 continue 和 break 命令, 其实非常简单
            continue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可。
            break: 在for 循环的外面的下一句写上一个标签,跳转到这位置即可。
            伪代码:
            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 指定发送到目标主机的数据包的大小。
        测试网络联接状况以及信息包发送和接收状况,但是不能够测试端口。
        ping 192.168.0.1 -t(不停的测试192.168.0.1,按ctrl+c停止)
        for /l %%a in (0, 1, 255) do ping 192.168.1.%%a -n 1 >> ip.txt(ping一下所有的局域网电脑)
    
    (2)telnet 命令
        测试端口使用 telnet IP地址或主机名 端口,使用tcp协议的。
        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.ext启动时的颜色。
        如果两参数一样,视为无效输入,只有一个参数时,设置字体。
        
    (4)random 命令
        产生随机数(正整数0~)
    
    (5)exit 命令
        结束程序,即时是被调用的程序,结束后也不会返回原程序。
        
    (6)shutdown命令
        shutdown -s 关机
        
    (7)所有内置命令的帮助信息
        ver /?
        cmd /?
        set /?
        rem /?
        if /?
        echo /?
        goto /?
        for /?
        shift /?
        call /?
        其他需要的常用命令
        type /?
        find /?
        findstr /?
        copy /?
        
五、字符串处理
    (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)计算字符串长度
        set tmpStr=123456
        ::将 tmpStr 复制到str,str 是个临时字符串
        set str=%tmpStr%
        ::标签,用于goto跳转
        :loop
        ::判断str是不是空,如果不是则执行下边的语句
        if not "%str%"=="" (
            ::算术运算,使num的值自增1,相当于num++或者++num语句
            set /a len+=1
            ::截取字符串,每次截短1
            set "str=%str:~1%"
            ::loop:这里利用goto和标签,构成循环结构
            goto loop
        )
        echo tmpStr=%tmpStr%
        echo tmpStr的长度为:%len%
        
    (5)截取字符串时,需要传递参数
        直接echo %args:~%num%,-5%没办法得到想要的字符串,需要如下三步:
        setlocal enabledelayedexpansion
        echo !args:~%num%,-5!
        endlocal
        
六、setlocal与变量延迟
    (1)在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。
        另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行。
        set a=4
        set a=5 & echo %a%
        结果是:4
        也可以对这种机制加以利用,如下的变量交换
        set a=a
        set b=b
        echo 交换前:a=%a%,b=%b%
        set a=%b% & set b=%a%
        echo 交换后:a=%a%,b=%b%
    
    (2)启动批处理文件中环境变量的本地化,本地化将持续到出现匹配的 endlocal 命令或者到达批处理文件结尾为止。
        语法: setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}
        enableextension: 启用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
        disableextensions: 禁用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
        enabledelayedexpansion: 启用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
        disabledelayedexpansion: 禁用延迟的环境变量扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
        
    (3)为了能够感知环境变量的动态变化,批处理设计了变量延迟,简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说"延迟"了对变量的赋值。
        setlocal enabledelayedexpansion
        set a=4
        set a=5 & echo !a!
        endlocal
        结果:5
        变量延迟的启动语句是"setlocal enabledelayedexpansion",并且变量要用一对叹号"!!"括起来
        由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了
        另外,启动变量延迟,"%"的变量还是不变
        setlocal enabledelayedexpansion
        for /l %%i in (1,1,5) do (
            set a=%%i
            echo !a!
        )
        endlocal
        结果:打印从1到5,如果不变量延迟,一个变量也没有打印。
        
七:文件处理
    (1)创建目录
        mkdir [drive:]path
        md [drive:]path
        路径有空格时,可以用双引号括起来
        
    (2)删除一个文件或多个文件
        del /s /q /f d:\test\a.bat
        将直接删除d:\test\a.bat,没有任务提示。
        del temp\* /q /f /s
        将直接删除本目录的temp目录的所有文件,没有任务提示。
        删除文件的时候可以使用"*"作通配符。
    
    (3)删除一个空目录
       rd d:\test\log
       提示用户是否删除,如果log目录里面有文件将无法删除。
       [rd|rmdir] /q /s d:\test\log
       /s    除目录本身外,还将删除指定目录下的所有子目录
       /q    安静模式,带 /s 删除目录树时不要求确认
       必须指定目录名称,不能使用通配符
       将直接删除d:\test\log目录。
   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值