echo命令
1 echo.输出空行
即相当于输入一个回车,echo后面的点要紧挨一起,中间不能有空格,后面的点可以用,:;/[ \ ]+等任一符号替代。即:下面的命令都是输出空行:
echo.
echo,
echo:
echo;
echo/
echo\
echo[
echo]
echo+
2 函数:
函数以一个标签开始,并以goto:eof结束
函数的调用以call开始,以goto:eof结束
@echo off
echo begin
call:myf1
echo end
echo.&goto:eof
::----
rem 函数开始部分
::----
:myf1
echo function start
echo.
echo function end
goto:eof
编写带参数的函数
采用%1%9来代表参数的值。而%0表示批处理文件本身,当然,如果传递的参数是“xxx”形式,而要获取的参数值为xxx,则需要使用%1形式的参数。
:myFunction
echo it could do %~1 of things %~2
goto:eof
调用时给函数传参
(参数直接放在函数后面,用空格或逗号分隔)
1.用空格或者逗号将参数分开
2.用双引号将带有空格的字符串参数括起来
比如下面的例子
@echo off
call:myFunction 100 hello
call:myFunction 100,hello
call:myFunction 100,"hello"
call:myFunction 100 "hello world"
echo.&pause&goto:eof
:myFunction
echo.
echo it could do %1 of things %2
echo it could do %~1 of things %~2
goto:eof
下面看几个例子:
例1 求fibonacco函数,编写fib.bat如下:
@echo off
setlocal enabledelayedexpansion
call:fib %1
goto:eof
:fib
set a1=1 & set a2=1
for /l %%i in (3,1,%1) do (
set /a t=a2
set /a a2=a1+a2
set /a a1=t
)
echo %a2%
goto:eof
例2 求jiecheng函数,编写jiecheng.bat.
@echo off
rem setlocal enabledelayedexpansion
call:jiecheng %1
goto:eof
:jiecheng
set res=1
for /l %%i in (2,1,%1) do (
set /a res=res*%%i
)
echo %res%
goto:eof
3 变量的设置与引用
调用函数后不像其他语言那样能有返回值,最常用的做法是先用set定义一个全局变量,然后在函数中使用该全局变量并将需要的值保存在全局变量中
直接用该全局变量。
set a=5
echo %a%
表达式类型的变量(set /a)
set /a var=2 - 1
set /a var=2 * 2
set /a var=2 / 2
set /a var=(1+1) + (1+1)
set /a a=1+1,b=2+1,c=3+1
set /a var+=1
set /a var*=2
运算符
() 分组
! ~ - 一元运算符
* / % 算数运算符
+ - 算数运算符
= *= /= %= += -= 赋值
&= ^= |= <<= >>= 表达式分隔符
对于逻辑或取余操作符,使用的时候需要添加引号才能正常使用,否则报错
<< >> 逻辑移位
& 按位“与”
^ 按位“异或”,
| 按位“或”
&&,||,&,|运算符
&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令)
& 顺序执行多条命令,而不管命令是否执行成功
| 管道命令 前一个命令的执行结果输出到后一个命令 如:help|more
> 清除文件中原有的内容后再写入
>> 追加内容到文件末尾,而不会清除原有的内容主要,指定文件如果不存在,则自动生成该文件
例1:copy nul 5.txt & echo 666 >>5.txt & more 5.txt
创建5.txt文档,向5.txt文档中写入内容“666”,输出5.txt的内容。
比较下面&和&&的不同:
4 逻辑与或非的实现
4.1、非
这个有现成的,条件判断前加not,例如:
C:\Users\HW>if 1==1 echo Ok
Ok
C:\Users\HW>if not 1==1 echo Ok
C:\Users\HW>
4.2、与
这个变通实现也还算简单:
C:\Users\HW>if 1==1 if 2==2 echo Ok
Ok
C:\Users\HW>if 1==1 if 2==3 echo Ok
C:\Users\HW>
较为清晰的写法:
if 1==1 (if 2==2 echo Ok)
if 1==1 (if 2==3 echo Ok)
4.3、或
dos不支持逻辑或,这个实现起来就比较繁琐了,网上可找到如下几种:(1)用多个if嵌套的;(2)用2个条件语句给一个变量赋值,再判断该变量的;(3)用for循环的。
这些做法都显得太麻烦。其实,直接用GOTO语句最简单,例如,下面的程序逻辑实现只输入1个参数或2个参数都不输入时,打印帮助信息:
if "%1"=="" goto printHelp
if "%2"=="" goto printHelp
:printHelp
@echo This is a help message, please refere to ...
5 字符串操作
字符串替换(=)
%PATH:str1=str2%这个操作就是把变量%PATH%里的str1全部用 str2替换。
实例:
字符串截取(~)
::从下标1对应的位置开始,截取4位字符(下标从0开始)
set c=%b:~1,4%
echo %c%
::从第2位开始截取,截止倒数第4位
set f=%b:~1,-4%
echo %f%
::截取3对应的下标到末尾的字符
set e=%b:~3%
echo %e%
::截取-3对应的下标到末尾的字符,即倒数3位
set d=%b:~-3%
echo %d%
再看一个例子:
函数的局部变量
局部变量放在SETLOCAL与ENDLOCAL之间定义。
SETLOCAL可以很好的保护函数内与外面的变量不会冲突。即:
setlocal
set var1=xxx
set var2=xxx
endlocal