Batch 脚本(批处理脚本)是在 Windows 操作系统中使用的一种脚本语言,用于自动化执行一系列命令。Batch 脚本是由 .bat 或 .cmd 文件扩展名标识的文本文件,这些文件可以被 Windows 的命令行解释器(如 cmd.exe)执行。Batch 脚本可以用来执行许多常见的任务,如文件操作、环境变量设置、程序启动等。
Batch 脚本的基本语法
Batch 脚本的基本语法包括:
命令:可以是内部命令(如 dir、cd、echo 等)或外部命令(如应用程序路径)。
批处理标签:用于标记脚本中的位置。
条件语句:用于根据条件执行不同的命令。
循环结构:用于重复执行某些命令。
变量:用于存储数据并在脚本中使用。
基本示例
下面是一个简单的 Batch 脚本示例,用于显示当前目录的内容,并提示用户确认后再退出:
@echo off
echo Current directory contents:
dir
pause
Batch 脚本的关键要素
注释:批处理脚本支持注释,使用 rem 或 :: 开头的行会被忽略。
变量:批处理脚本支持变量,可以通过 %variable% 来引用变量。变量可以通过命令行参数、内置命令或手动赋值来设置。
命令行参数:批处理脚本可以接收命令行参数,这些参数可以从 %%1、%%2 等访问。
手动赋值:可以在脚本中直接赋值给变量,如 set var=value。
环境变量:可以使用系统环境变量,如 %PATH%。
set MY_VAR=Hello
echo %MY_VAR%
条件语句:使用 if 语句来根据条件执行不同的命令。
文件存在性检查:
if exist file.txt (
echo File exists.
) else (
echo File does not exist.
)
字符串比较:
set str=hello
if "%str%"=="hello" (
echo String matches.
) else (
echo String does not match.
)
循环结构:使用 for 循环来迭代文件、目录或命令输出。
迭代文件:
for %%f in (*.txt) do (
echo Found file: %%f
)
迭代命令输出:
for /f "delims=" %%f in ('dir /b *.txt') do (
echo Found file: %%f
)
批处理标签和 goto:使用标签和 goto 语句来跳转到脚本中的不同位置。
示例:
:start
echo Hello!
pause
goto end:end
echo Goodbye!
子脚本调用:可以使用 call 命令来调用另一个批处理脚本或当前脚本中的函数。 示例:
call :my_function
exit /b:my_function
echo This is a function.
复杂示例
下面是一个更复杂的示例脚本,用于备份当前目录下的所有 .txt 文件到另一个目录,并在备份完成后显示一个消息框:
@echo off
setlocal EnableDelayedExpansionrem 设置备份目标目录
set BACKUP_DIR=C:\Backup\TXT_Backuprem 创建备份目录(如果不存在)
if not exist "%BACKUP_DIR%" mkdir "%BACKUP_DIR%"rem 遍历当前目录下的所有 .txt 文件并复制到备份目录
for %%f in (*.txt) do (
copy "%%f" "%BACKUP_DIR%\%%~nf_!DATE:~-4,4!!DATE:~-7,2!!DATE:~-10,2!.txt" /y
)rem 显示备份完成的消息框
msg * Backup completed successfully!endlocal
常见命令
以下是一些常用的 Batch 脚本命令:
echo:显示一行文本。
pause:暂停脚本执行,直到用户按下任意键。
cd:更改当前目录。
dir:列出目录内容。
md 或 mkdir:创建目录。
rd 或 rmdir:删除目录。
copy:复制文件。
move:移动文件。
del 或 erase:删除文件。
if:条件语句。
for:循环语句。
set:设置变量。
call:调用另一个批处理脚本或当前脚本中的函数。
exit:退出批处理脚本。
msg:显示消息框。
更复杂的示例
下面的示例为一个启动服务的例子,包含两个文件:启动核心.bat 和 启动服务.tpl
启动核心.bat
@echo off
setlocal enabledelayedexpansion
:SECTION_START
echo ********************************************************************
echo * 即将重启st服务:
echo * 清理上日日志
echo * 重启( 仲裁、核心、管理前置、交易前置、网关、消息中心、日志服务器)
echo *********************************************************************
set yesno=a
set /p yesno=" 即将执行清理查询核心日志操作(rm -rf ./log),请确认(y or n):
if /i "%yesno%"=="n" (goto SECTION_END)
if /i not "%yesno%"=="y" (goto SECTION_START)echo -----------------------------清理日志开始------------------------
call :FUNC_DELETE_FILES %1 query1 ./log
call :FUNC_DELETE_FILES %1 query2 ./log
echo ------------------------------清理日志结束------------------------:SECTION_ST_CLEARSTART
set yesno=a
set /p yesno=" 即将清流重启ST,请确定(y or n):
if /i "%yesno%"=="n" (goto SECTION_END)
if /i not "%yesno%"=="y" (goto SECTION_ST_CLEARSTART)echo --------------------------------------------------------------------
echo * 即将停止 trade...
echo --------------------------------------------------------------------
call :FUNC_STOP_SVR_FROM_FILE %1 trade1 %5
call :FUNC_STOP_SVR_FROM_FILE %1 trade2 %5
call :FUNC_STOP_SVR_FROM_FILE %1 query1 %5
call :FUNC_STOP_SVR_FROM_FILE %1 query2 %5
echo --------------------------------------------------------------------
echo * 即将启动 trade...
echo --------------------------------------------------------------------
call :FUNC_START_SVR_FROM_FILE %1 query1 0 0 %5
call :FUNC_START_SVR_FROM_FILE %1 query2 0 0 %5
call :FUNC_START_SVR_FROM_FILE %1 trade1 0 1 %5
call :FUNC_START_SVR_FROM_FILE %1 trade2 0 1 %5
echo --------------------------------------------------------------------echo * 程序启动成功,按任意键退出 ...
echo --------------------------------------------------------------------:SECTION_END
pause
exit
启动服务.tpl
name=启动服务
note=启动服务器上ST服务
param=CONFIG|服务配置|info.txt中配置的服务名称
param=STATUS|标志|0:模式0 1:模式1
param=PWD|密码串
========================================================================
call :FUNC_START_SVR_FROM_FILE %1 {CONFIG} {STATUS} {PWD}
========================================================================
rem ----------------------------------------------------
rem 通过加载info.txt中的指定配置启动linux进程
rem call :FUNC_START_SVR_FROM_FILE 工作目录 ipinfos中配置的名称 标志
rem -------------------------------------------------------------------------
:FUNC_START_SVR_FROM_FILE
set SVRFILE=config/info.txt
if not exist %SVRFILE% (
echo 请先配置%SVRFILE%!
pause
goto :eof
)
set FIND=no
for /F "tokens=1,2,3,4,5,6,7" %%C in (%SVRFILE%) do (
if /I %%C==%2 (
set FIND=yes
set HOST=%%D
set USER=%%E
set PWD=%%F
set CFG=%%G.xml
set SVR=%%H
set APPNO=%%I
)
)
if "%FIND%"=="no" (
echo %SVRFILE%中未找到%2的配置信息
pause
goto :eof
)set pass_str=%4
set num=0
set pwd_flag=a
set check_flag=aif not "%PWD%"=="*" set pwd_flag=b
if "%pass_str%"==" " set check_flag=b
if not defined pass_str set check_flag=b
if "%check_flag%" == "b" (
if "%pwd_flag%" == "a" (
echo 当前配置为从监控服务器获取密码,但密码串为空,请检查info和脚本的配置是否正确
goto :eof
)
)if "%pwd_flag%" == "a" (
set pass_words=%pass_str:`= %
:passloop_start_svr
for /f "tokens=1,2,3,*" %%i in ("%pass_words%") do (
if %%i == %HOST% (
if %%j == %USER% (
set num=1
set PWD=%%k
)
)
set pass_words=%%l)
if defined pass_words goto passloop_start_svr
if %num%==0 (
echo %2未获取到密码信息,主机IP %HOST% 主机用户名 %USER%
goto :eof
)
)call :FUNC_START_SVR %1 %HOST% %USER% %PWD% %CFG% %SVR% %APPNO% %3
goto :eofrem --------------------------------------------------------------------------
rem 启动linux服务器进程
rem call :FUNC_START_SVR 工作目录 地址 用户 密码 配置文件 启动进程 服务编号 清流标志
rem ------------------------------------------------------------------------------------
:FUNC_START_SVR
SET Today=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
SET Today=%Today: =0%
echo source ~/.bash_profile > %1\%5#%7.txt
echo cd workspace >> %1\%5#%7.txt
echo stserver -f %5 -start %6 -t ar -s %7 -status %8 -c r log/%Today%_%5.out ^& >> %1\%5#%7.txt
echo plink -l %3 -pw %4 %2 -m %1\%5#%7.txt > %1\cmd.out >> %1\%5#%7_0.txt
plink -l %3 -pw %4 %2 -m %1\%5#%7.txt > %1\cmd.out
echo lcd %1 > %1\%5#%7_1.txt
echo get workspace/log/%Today%_%5.out >> %1\%5#%7_1.txt
echo bye >> %1\%5#%7_1.txt
echo psftp %2 -l %3 -pw %4 -b %1\%5#%7_1.txt > %1\cmd.out >> %1\%5#%7_2.txt
psftp %2 -l %3 -pw %4 -b %1\%5#%7_1.txt > %1\cmd.out
type %1\%Today%_%5.out
del %1\cmd.out
goto :eof