bat文件浅析(四)


转义和续行符^

         1.将批处理文件的特殊符号转义,就像Java和c中的转义字符\

C:\Users\Administrator>echo >
命令语法不正确。

C:\Users\Administrator>echo >>
命令语法不正确。

C:\Users\Administrator>echo &
ECHO 处于打开状态。

C:\Users\Administrator>echo <
命令语法不正确。

C:\Users\Administrator>echo |
命令语法不正确。

C:\Users\Administrator>echo ^>>
命令语法不正确。

C:\Users\Administrator>echo ^>^>
>>

C:\Users\Administrator>echo ^>
>

C:\Users\Administrator>echo ^&
&

C:\Users\Administrator>echo ^|
|
        2.bat文件是按行执行命令的,当你一行无法把一条命令写完时,需要用续行符续行。
C:\Users\Administrator>echo hello w^
More? orld
hello world
        为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。
下面的介绍还会用到续行符。


comp命令

C:\Users\Administrator>help comp
比较两个文件或两个文件集的内容。

COMP [data1] [data2] [/D] [/A] [/L] [/N=number] [/C] [/OFF[LINE]]

  data1      指定要比较的第一个文件的位置和名称。
  data2      指定要比较的第二个文件的位置和名称。
  /D         以十进制格式显示差异。
  /A         以 ASCII 字符显示差异。
  /L         显示不同的行数。
  /N=number  只比较每个文件中第一个指定的行数。
  /C         比较文件时 ASCII 字母不区分大小写。
  /OFF[LINE] 不要跳过带有脱机属性集的文件。

要比较文件集,请在 data1 和 data2 参数中使用通配符。
        先创建两个文件C:\Users\Administrator\Desktop\testbat.txt和C:\Users\Administrator\Desktop\testbat1.txt。其中前者内容是“abcdefg”,后者内容是“abcd123”。现在可以执行如下命令:

C:\Users\Administrator>comp C:\Users\Administrator\Desktop\testbat.txt C:\Users\Administrator\Desktop\testbat1.txt /l /a
比较 C:\Users\Administrator\Desktop\testbat.txt 和 C:\Users\Administrator\Desktop\testbat1.txt...
在 LINE 1 比较错误
file1= e
file2 = 1
在 LINE 1 比较错误
file1= f
file2 = 2
在 LINE 1 比较错误
file1= g
file2 = 3
是否要比较更多文件 (Y/N)? n


If命令

      if命令部分帮助信息

C:\Users\Administrator>help if
执行批处理程序中的条件处理。

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

  NOT               指定只有条件为 false 的情况下,Windows 才
                    应该执行该命令。

  ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
                    指定数字的退出代码,指定条件为 true。

  string1==string2  如果指定的文字字符串匹配,指定条件为 true。

  EXIST filename    如果指定的文件名存在,指定条件为 true。

  command           如果符合条件,指定要执行的命令。如果指定的
                    条件为 FALSE,命令后可跟 ELSE 命令,该命令将
                    在 ELSE 关键字之后执行该命令。

ELSE 子句必须出现在同一行上的 IF 之后。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

由于 del 命令需要用新的一行终止,因此以下子句不会有效:

IF EXIST filename. del filename. ELSE echo filename. missing

由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

如果都放在同一行上,以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

如果命令扩展被启用,IF 会如下改变:

    IF [/I] string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF DEFINED variable command

其中, compare-op 可以是:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

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

  1)IF [NOT] string1==string2 command

     下面是test4_0.cmd内容:

@echo off

echo Hello , here is test4_0.cmd
echo ---------------------------
echo Is the first input args equal "a"?

if %1 == a (
 echo Yes ,it is .
)  else  (
 echo No , it is not .
 echo It is "%1" .
)

pause

         在cmd控制台中运行结果如下:

C:\Users\Administrator>call C:\Users\Administrator\Desktop\test4_0.cmd inputInfoHere
Hello , here is test4_0.cmd
---------------------------
Is the first input args equal "a"?
No , it is not .
It is "inputInfoHere" .
请按任意键继续. . .


  2)IF [NOT] EXIST filename command

   下面是test4_1.cmd内容:

@echo off

echo Hello , here is test4_1.cmd
echo ---------------------------
echo Startting test4_0.cmd ...

if exist C:\Users\Administrator\Desktop\test4_0.cmd start C:\Users\Administrator\Desktop\test4_0.cmd  infohere

echo test4_1.cmd will pause !!
pause

    运行上述文件之前需要适当的修改一下,运行的结果:

    先弹出一个cmd控制台,其打印如下:

Hello , here is test4_1.cmd
---------------------------
Startting test4_0.cmd ...
test4_1.cmd will pause !!
请按任意键继续. . .
紧跟着弹出另一个cmd控制台,其打印如下:

Hello , here is test4_0.cmd
---------------------------
Is the first input args equal "a"?
No , it is not .
It is "infohere" .
请按任意键继续. . .
    这是两个相对独立的运行过程,因为用的是start命令而不是call,具体请参见 bat文件浅析(二)    


  3)IF [NOT] ERRORLEVEL number command

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

     常见的返回码为01。通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。运行如下test4_2.cmd文件:

@echo off

comp C:\Users\Administrator\Desktop\testbat.txt C:\Users\Administrator\Desktop\testbat1.txt /l /a
echo %errorlevel%
if errorlevel 1 echo They are not the same .

pause
        运行结果:

比较 C:\Users\Administrator\Desktop\testbat.txt 和 C:\Users\Administrator\Desktop\testbat1.txt...
在 LINE 1 比较错误
file1= e
file2 = 1
在 LINE 1 比较错误
file1= f
file2 = 2
在 LINE 1 比较错误
file1= g
file2 = 3
是否要比较更多文件 (Y/N)? n
1
They are not the same .
请按任意键继续. . .


  4)ELSE

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

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

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

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

    例: 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 - 大于或等于

 

choice命令

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

C:\Users\Administrator>choice /?

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
    该工具允许用户从选择列表选择一个项目并返回所选项目的索引。

参数列表:
   /C    choices       指定要创建的选项列表。默认列表是 "YN"。

   /N                  在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。

   /CS                 允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。

   /T    timeout       做出默认选择之前,暂停的秒数。可接受的值是从 0到 9999。如果指定了 0,就不会有暂停,默认选项会得到选择。

   /D    choice        在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

   /M    text          指定提示之前要显示的消息。如果没有指定,工具只显示提示。

   /?                  显示此帮助消息。

   注意:
   ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,
   该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0
   的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。

示例:
   CHOICE /?
   CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
   CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"

 如下test4_3.cmd测试文件,注意errorlevel是由大到小的顺序判断的:

@echo off

choice /c xyz /m "Say hello input x ;Say goodbye input y;Say ding input z"

if errorlevel 3 ( 
  echo ding
) else if errorlevel 2 ( 
  echo goodbye 
) else if errorlevel 1 (
  echo hello
)

pause
    运行结果:

Say hello input x ;Say goodbye input y;Say ding input z [X,Y,Z]?Y
goodbye
请按任意键继续. . .

 

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") DOcommand

       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)使用实例:

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

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

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

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

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

for /R E:\test %%b in (*.txt *.bat) do echo %%b
for /r %%c in (*) do (echo %%c) ::遍历当前目录下所有文件

     c. 如下命令行将产生序列 1 23 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循环的外面的下一句写上一个标签,跳转到这位置即可

     如下 (伪代码)

       for /F ["options"] %variable IN (command)  DO (
       ... do command ...
        if ... goto continue
       if ... goto break
       ... do command ...
       :continue
       )
       :break

 

最后给一个例子:

for /f "delims=" %%i in ('dir /b /a-d /s "%FILE_PATH%"') do (
	::文件夹
	echo %%~dpi
	::文件名
	echo %%~nxi
	::文件后缀
	echo %%~xi
	::文件绝对路径
	echo %%~i
    echo ------------------xxxxxxxxxxx---------------------
 )

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值