手把手教你写windows BAT
最近工作中老是用到BAT文件,在此做一下小结。
BAT文件中的变量
设置变量
语法:SET 变量名=变量值
说明:%变量名% 将可使用变量
例: SET A="Hello"
ECHO %A%
取消变量
语法: SET 变量名=
说明:%变量名%将变为空
例: SET A=
显示变量
语法: SET 变量名
说明: 将展示所有以变量名开头的变量
如果只输入SET, 将会展示出所有的变量
例: SET
输入变量(/p)
语法: SET /p 变量名=提示
说明: 屏幕出现提示,用户输入将赋值给变量
例: SET /p A="Input a value:"
数值变量(/a)
语法: SET /a A=变量值或表达示
说明: SET /a A=1+2 => A == 3
例: SET /a A=1+2
ECHO %A%
注意:
SET语句不能出现在复合语句如if或者for语句中。
预定义变量
%CD% : 当前路径
%PATH%: 当前环境变量
%RANDOM%: 随机数
%TIME%: 当前时间
%DATE%: 当前日期
%0%: 当前BAT文件的路径(包含文件名)
%1%: 当前BAT文件的输入参数,%2,%3…..以此类推
扩展变量
当前路径及文件名为:C:\code\Test.txt
%0: Test.txt
%~dp0: C:\code\
%cd%: C:\code
%~nx0: Test.txt
%~n0: Test
%~x0: .txt
关于变量的截断
%VAR:str1=str2%, 将%VAR%中的str1替换成str2
%VAR:~0,-2%: 提取%VAR%中从开始到倒数2个字符。
%VAR:~2%: 从第2个字符开始到最后
%VAR:~-2%: 从开始到倒数第2个字符
%VAR:~2,5%: 从第2个字符到第5个字符
BAT文件的常用关键字及语法
IF语句
判断参数
if "%1"=="/?" goto :usage
if "%A%"=="help" goto :usage
判断是否存在
if exist c:\test.txt echo yes
if not exist c:\test.txt echo no
if exist %filename% (
del %filename%
)else (
echo %filename% is missing
)
判断数值
if %ERRORLEVEL% EQU 0 echo no error
FOR语句
用for语句遍历所有参数
for %%x in (%*) do (
echo %%X
)
GOTO语句
GOTO :Tag1
:Tag1
echo 'hello'
CALL语句
CALL语句与GOTO语句的主要区别在于,CALL语句可以传递参数,而且调用完会返回。GOTO语句则是直接跳转。
@echo off
@echo 'Call function here!'
@call :myfunc 1 2
@echo 'Call function return'
GOTO :EOF
:: Function definition here
:myfunc
echo 'myfunc here!'
set /a number1=%~1
set /a number2=%~2
echo param1 is %number1%
echo param2 is %number2%
GOTO :EOF
在函数中可以直接使用全局变量来传递返回值。
调用者也可能通过传递一个变量来给函数保存返回值。
@echo off
echo test function
set var1='yes'
echo before call, var is %var1%
call :myfunc var1
echo after call, var is %var1%
goto :EOF
:myfunc
set %~1='no'
goto :EOF
如何使局部变量与全局变量不冲突?
可以使用SETLOCAL/ENDLOCAL来实现这一功能
@echo off
echo test function
set var1='yes'
set var2='here'
echo before call, var1 is %var1%
echo before call, var2 is %var2%
call :myfunc var1
echo after call, var1 is %var1%
echo after call, var2 is %var2%
goto :EOF
:myfunc
SETLOCAL
set var2='there'
(
ENDLOCAL
set %~1='no'
)
goto :EOF