Bat批处理文件
1. 批处理脚本
批处理脚本就是把一个一个的命令外加一些逻辑控制组合在一起使其可一次都被执行的文本文件。在Linux上为Shell脚本,而在Windows上则为bat脚本。Windows下脚本命令能够执行需要同时满足以下两个条件:
- 路径
- 使用以驱动盘符开始的绝对路径,如c:\a\b.bat
- 使用从当前目录开始的相对路径,比如 b.bat或者..\a..bat
- 在系统环境变量PATH中指定的某一个目录下,比如%PATH%中包含c:\a时,可以在命令行上直接执行b.bat
- 可执行
后缀是.bat/cmd/com/exe的文件批处理文件一般需要在命令行下执行,其中95/98下的命令行叫做MS-DOS命令行,而NT系的命令行才叫命令行终端
2. 变量的声明和赋值(set 和=)
批处理脚本的环境变量有延迟解析的问题,即环境变量是在这一行开始执行前就已经被替换掉了的。可以通过【cmd.exe /v:on】或者【setlocal ENABLEDELAYEDEXPANSION】来避免该问题,或者将块处理中的代码函数化(函数中就不能再使用语句块和setlocal了--针对对象变量)当使用call a.bat执行完a.bat之后,在a.bat(没有使用setlocal)中使用set命令设置过的变量,在当前脚本中还能够继续被使用,且其值为a.bat中设置过的值set 变量名=值 如果等号(=)前后有空格的话,那么空格也作为变量名或者值的一部分了set /a 变量名=算术表达式 计算算术表达式的值,并将将其赋给变量,如【set /a test= %test% * 2】set /p 变量名=提示信息 这时提示信息会被提示给用户,并等待用户的输入,输入的内容赋值给变量set 变量名=% 变量名 %值 在变量末尾追加”值“set 变量名= 删除变量set 所有变量的一览set 变量前缀 所有以变量前缀开头的变量的一览setlocal/endlocal 局部环境变量的声明,即使没有用endlocal,在批处理脚本结束的时候也会隐含的调用endlocal
一些特殊的环境变量:
3. 流程控制
1). if / else条件判断
注意:1. 命令1/命令2 必须要使用()括起来,当要执行多个命令的时候也必须使用()括起来2. 在判断的==两边,尽量使用{}而不是使用"",因为如果%1中含有"的时候,该判断会出错3. 在字符串比较的时候,【/i】表示比较的字符串不区分大小写。4. if和else必须在同一行,或者if和最初的(在同一行,)和else在同一行,else后面必须有空格
IF {%1}=={%2} (
echo eq l.
) ELSE (
echo not eq l.
)
5. 因为没有相当于and 和or这样的操作符,所以不能进行复杂的运算6. 可以使用的比较操作符如下
2). for循环
注意:
1. 关于【%变量】,如果是在批处理文件中时,需要写成【&&变量】,在命令行时为【%变量】。其中变量 可以为a~z或者A~Z之间的任意一个字母,但是该变量名区分大小写。2. 集合中各个元素的分隔符可以使用逗号(,),空格,分号(;)中的任意一种,或者混合使用,因此像 【%CLASSPATH%】和【%*】这样的变量也可以指定在集合的位置。但是集合中的某个元素包含特殊 字符,比如【(】或者【)】时,需要使用【^】对其进行转义,即写成【^)】的样子。3. 如果想使用【@】来达到执行时命令行不被显示的目的的话,需要在for前面和do后面的命令前两两个地方 都要加上【@】符号。4. 在使用/f参数的时候,可以使用双引号指定一下选项。使用空格分隔可以指定多个选项。
3). goto语句和标签
if %~1 == abc goto match
echo 不一致
goto :EOF
:match
echo 一致
使用【:字符串】来声明一个标签,然后使用【goto 标签】来跳到指定的标签出,实现处理的转移但是EOF是bat脚本中默认的隐含标签,表示到该批处理文件的结尾。因为需要使用【goto :EOF】来表示。
4). switch语句
在批处理脚本中没有switch/case这样的语句,需要使用goto语句来模拟。(如下)但是要注意,这并不能完全实现。比如不能实现others或者default的功能,因为如果在goto后面指定一个不存在的标签时,在运行到那里的时候会报批处理脚本的错误。
set case=1
goto caseA_%case%
:caseA_1
echo case1
goto caseA_end
:caseA_2
echo case2
goto caseA_end
:caseA_end
5). 死循环
process_:start
echo do process
goto process_start
6). 函数
需要注意 延迟环境变量的问题,特别是使用for或者if的语句块时7) pause 暂停语句,执行到pause语句后,会等待用户的指示,然后继续执行C:\Documents and Settings\user>pause请按任意键继续. . .
4. 关于输入输出/重定向
(1) 标准输出重定向到文件中(新建一个文件,或者覆盖原有内容)【格式】 command > filename 【例子】 dir > out.txt
(2) 标准输出追加到既存文件的末尾【格式】 command >> filename 【例子】 dir >> out.txt (3) 标准错误重定向到文件中(新建文件或者覆盖原文件内容)【格式】 command 2> filename 【例子】 dir nonexist.txt 2>stderr.txt (注)"2"和">"不能存在空格,否则的话2会被解释为命令的参数(4) 标准输出和错误输出都重定向到文件中 (新建文件或者覆盖原文件内容)【格式】 command > filename 2>&1 【例子】 dir nonexist.txt > out.txt 2>&1 (5) 标准输出和错误输出都重定向到NUL中,不进行显示【格式】 command 2>NUL 1>NUL 【例子】 dir nonexist.txt 2>NUL 1>NUL(6) 通过管道符来实现重定向,即将前一命令的标准输出作为后一命令的标准输入【格式】 command1 |command2【例子】 type aaa.txt | more(7) 从文件中读取内容,作为一个命令的输入【格式】 command1 < file【例子】 more <aaa.txt如果是想要标准输入作为for命令的输入时,需要使用管道的形式(command | for语句),即需要借助一个从标准输入读取数据然后又原样输出到标准输出的命令,然后for命令以管道的形式使用那个命令的输出。无论是在脚本外还是脚本内,都需要这样做。如果直接使用文件作为for语句的标准输入时,将会得不到文件中的内容。但是使用管道的话,管道后面的do语句中就不能再使用call 标签的形式了,好像是管道后面被作为了另外一个脚本来处理(8) 从文件中或者命令行的输出中读取内容进行处理时,请使用for语句的/f选项,具体请参照流程控制中的for语句说明。(9) 输出到标准输出【格式】 echo 字符串 【例子】 echo aaaa如果是输出空行可以使用【echo.】或者【echo]】
5. 脚本中命令/脚本/函数的执行
- 命令的执行在脚本中直接执行就可以了,如a.exe
- 脚本的执行,直接执行 a.bat,则a.bat后面的处理将不会再被执行
- 脚本的执行,如果使用 call a.bat,则a.bat被执行,且脚本中a.bat后面的处理也会被执行,且a.bat中设置的变量也能够继续被访问
- 函数的执行,关于函数的定义和调用,请参照流程控制中的函数部分说明。
关于命令执行后的退出码的取得,可以通过%ERRORLEVEL%变量来取得,在被执行的脚本或者函数中需要使用 exit /b来返回退出码关于命令或者被执行的脚本/函数中标准输出的获得,可以参照流程控制中的for语句的说明。
6. 注释
使用【rem】或者【::】来注释。但是被执行的命令还是会被输出出来。比如注释的命令【rem comment】。如果只是想注释本身不被显示,而被执行的命令被显示出来的话,可以使用【@rem】来进行注释如果不想被执行的命令也被输出出来,需要执行【echo off】。但是这个命令本身却会被输出出来,所以需要写成【@echo off】的样子。
7. 关于退出脚本及函数
使用 【ERRORLEVEL 】可以取得exit的退出值
1). 退出当前脚本goto :EOF 或者 exit /B:EOF是特殊的标签,表示批处理文件的最后2). 退出函数exit /B3). 退出CMD程序exit 0对于使用exit退出的脚本,可以使用cmd /c test.bat来执行,这样不会退出终端,且能使用 【ERRORLEVEL 】取得退出值
8. 取字符串字串的操作(正确的说法应该叫环境变量的替换)
下面的用法可以通过【set /?】来查看x为字符串变量,m是从0开始的,-m的时候m是从1开始的
- 当脚本参数为文件时的一些方便处理(可以查看for的帮助)
取得文件的目录,盘符,文件名等,这里以第一个参数%1为例:
10. 命令行模式下可以使用的快捷键
下面的这些快捷键都是已经嵌入到了2000/XP的命令行中的
如果想要自己定义快捷键,可以使用doskey命令来做
11. 命令执行时用到的几个符号
12.一些特殊设备
13. Windows命令一览
1)目录磁盘操作命令
2)关于文件的操作
3)关于网络的操作
4)关于配置/操作系统设定的操作
5) net 命令的各子命令