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

运算符

() 分组
! ~ - 一元运算符
* / % 算数运算符
+ - 算数运算符

= *= /= %= += -= 赋值
&= ^= |= <<= >>= 表达式分隔符

对于逻辑或取余操作符,使用的时候需要添加引号才能正常使用,否则报错
<< >> 逻辑移位
& 按位“与”
^ 按位“异或”,
| 按位“或”

echo为什么要空一行linux echo输出空行_赋值

&&,||,&,|运算符

&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令

|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令)

&  顺序执行多条命令,而不管命令是否执行成功

|  管道命令 前一个命令的执行结果输出到后一个命令 如:help|more

> 清除文件中原有的内容后再写入

>> 追加内容到文件末尾,而不会清除原有的内容主要,指定文件如果不存在,则自动生成该文件


例1:copy nul 5.txt & echo 666 >>5.txt & more 5.txt

创建5.txt文档,向5.txt文档中写入内容“666”,输出5.txt的内容。

比较下面&和&&的不同:

echo为什么要空一行linux echo输出空行_echo为什么要空一行linux_02

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替换。

实例:

echo为什么要空一行linux echo输出空行_赋值_03

字符串截取(~)

::从下标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%

再看一个例子:

echo为什么要空一行linux echo输出空行_赋值_04

函数的局部变量
局部变量放在SETLOCAL与ENDLOCAL之间定义。
SETLOCAL可以很好的保护函数内与外面的变量不会冲突。即:

setlocal
set var1=xxx
set var2=xxx
endlocal