bat基础
%0 当前 batch 文件名
%n 第 n 个命令行参数(1 <= n <= 9)
%* 所有的命令行参数
请求用户输入
set /p LOG_PATH=请输入log绝对路径:
echo. 输出空行
echo; 输出空行
打开回显或关闭回显功能
格式:echo [{ on|off }]
errorlevel 程序返回码
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为0,一般命令执行出错会设 errorlevel 为1
& 连接多个可执行的命令
title
设置cmd窗口的标题
title this is the title
COLOR
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。
COLOR fc 在亮白色上产生亮红色
mode 配置系统设备
mode con cols=113 lines=15 & color 9f
此命令设置DOS窗口大小:15行,113列
start 命令
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
例:start explorer d:\
调用图形界面打开D盘
CALL
CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理
CALL command
调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套,见教程后面。在批处理编程中,可以根据一定条件生成命令字符串,用call可以执行该字符串,见例子。
CALL [drive:][path]filename [batch-parameters]
调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
CALL :label arguments
调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头
IF [NOT] string1==string2 command
string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)
条件相等后即执行后面的command
检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式
if [NOT] {string1}=={string2} command //这个貌似不行
if [NOT] [string1]==[string2] command //这个貌似不行
if [NOT] "string1"=="string2" command
setlocal 与 变量延迟
变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来
set a=4
set a=5 & echo %a%
pause
结果:4
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
结果:5
@ 命令行回显屏蔽符
& 组合命令 每条命令都执行
&& 组合命令 某条命令失败则不执行后面的命令
|| 组合命令 某条命令成功则不在执行后面的命令
* ? 文件通配符
*号表示任意N个字符,而?号只表示任意一个字符
/ 参数开关引导符
ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求
% 批处理变量引导符
这个百分号严格来说是算不上命令的,它只是批处理中的参数而已
引用变量用%var%,调用程序外部参数用%1至%9等等
echo %* 打印所有参数
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
| 命令管道符
dir c:\|find "txt"
以上命令是:查找C:\所有,并发现TXT字符串。
^ 转义字符
^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如
echo test ^>1.txt
结果则是:test >1.txt
IF [NOT] EXIST filename command
EXIST filename为文件或目录存在的意思
FOR %%variable IN (set) DO command [command-parameters]
for %%i in (1 2 3 4 6) do echo %%i
参数:FOR有4个参数 /d /l /r /f
参数 /d
如果集合中包含通配符,则指定与目录名匹配,而不与文件名匹配。
如果 Set(也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。
这个参数主要用于目录搜索,不会搜索文件,看这样的例子
@echo off
for /d %%i in (c:\*) do echo %%i
运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示
比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
@echo off
for /d %%i in (???) do echo %%i
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符
参数/r 递归
for %%i in (1 2 3 4 6) do echo %%i
for /R ./ %%i in (*.bat) do echo %%i
::命令提示符中输入时使用单个%
:: for /R ./ %i in (*.bat) do echo %i
参数 /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)。
增强用法中还有一些用来判断数字的符号:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
set /a 是批处理中进行算术的命令,可进行加、减、乘、除、取余操作。 它们的符号分别是 + - * / %% set /a 可计算的数值, set /a var=12 set /a var=12,num=3,str=100 利用逗号,在计算时也可以这样连续。 EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 @echo off set /a a = 3 echo %a% set /a b = 2 echo %b% if %a% LSS %b% (echo a ) else (echo b) pause
SHIFT [/n]
如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。
例如:SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
set
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。
@echo off echo xx @echo on echo yy :: here is the comment1 rem here is the comment2 %here is the comment3% rem %%百分号之间的内容都会帮当做注释的 echo hehe%this is a comment4%haha goto start here is the comment5 it can be several lines :start pause echo test1 & echo test2 set aa=123456 echo %aa% if 123==123 echo haha if "12 3"=="12 3" echo haha if not 123==111 echo dog set a=4 set a=5 & echo %a% setlocal enabledelayedexpansion set a=4 set a=5 & echo !a! echo %0 for %%i in (1 2 3 4 6) do echo %%i for /R ./ %%i in (*.bat) do echo %%i ::命令提示符中输入时使用单个% :: for /R ./ %i in (*.bat) do echo %i ::输出5 4 3 2 1 for /l %%i in (5,-1,1) do echo %%i ::返回当前目录 C:\Users\c00390379\Desktop>echo %cd% C:\Users\c00390379\Desktop
@echo off echo %0 echo %1 echo %2 echo %*
C:\Users\c00390379\Desktop>test.bat 123 456
test.bat
123
456
123 456
@echo off set sum=0 call :sub sum 10 20 35 echo sum: %sum% pause goto :eof :sub rem 参数1为返回变量名称 set /a %1=%1+%2 shift /2 if not "%2"=="" goto sub goto :eof
子程序尾部加上goto :eof 这样会跳转回执行call语句的地方继续执行下面的语句
@echo off ::/i 忽略大小写 if /i abc==abC (echo haha) else (echo hehe) ::交换两个变量的值,但是不使用临时变量 set var1=abc set var2=123 echo before: var1=%var1% var2=%var2% set var1=%var2%& set var2=%var1% echo after: var1=%var1% var2=%var2% echo %~f0 call :hehe echo gaga goto :eof :hehe echo bhcnm goto :eof
cd 使用/D开关,除了改变驱动器的当前目录之外,还可改变当前驱动器。
%~dp0 “d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径
选项语法:
~0 - 删除任何引号("),扩充 %0
%~f0 - 将 %0 扩充到一个完全合格的路径名(“f”是file,即文件)
%~d0 - 仅将 %0 扩充到一个驱动器号
%~p0 - 仅将 %0 扩充到一个路径
%~n0 - 仅将 %0 扩充到一个文件名(“n”是name 文件名)
%~x0 - 仅将 %0 扩充到一个文件扩展名
%~s0 - 扩充的路径只含有短名(“s”为Short,短的)
%~a0 - 将 %0 扩充到文件的文件属性(“a”为attribute,即属性)
%~t0 - 将 %0 扩充到文件的日期/时间(“t”time)
%~z0 - 将 %0 扩充到文件的大小(Size 大小)
%~$PATH:0 - 查找列在路径环境变量的目录,并将 %0 扩充
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩充到
空字符串
可以组合修饰符来得到多重结果:
%~dp0 - 仅将 %0 扩充到一个驱动器号和路径
%~nx0 - 仅将 %0 扩充到一个文件名和扩展名
%~fs0 - 仅将 %0 扩充到一个带有短名的完整路径名
%~dp$PATH:0 - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftza0 - 将 %0 扩充到类似输出线路的 DIR
::\Users\c00390379\Desktop\
echo %~p0
环境变量长度为LEN =
%variable:~m,n%
第一个数字表示偏移量,如果为负值则偏移量为LEN + m
第二个数字为正值则表示长度,为负数则表示结束偏移量为LEN + n(或者解释为不要后面-n个字符)
C:\Users\Desktop>echo ss=123456789 ss=123456789 C:\Users\Desktop>echo %ss% 123456789 C:\Users\Desktop>echo %ss:~3,4% 4567 C:\Users\Desktop>echo %ss:~-5,4% 5678 C:\Users\Desktop>echo %ss:~2,-2% 34567 C:\Users\Desktop>echo %time% 17:21:22.59 C:\Users\Desktop>echo %time:~0,8% 17:21:46

浙公网安备 33010602011771号