Bat脚本学习-1:合并Sql存储过程

@echo off&PUSHD %~DP0 &TITLE 合并存储过程
:菜单
cls
set user_input=0
mode con cols=120 lines=40
echo.
echo 请选择要合并存储过程的子系统(直接回车可以退出):
echo.
echo 输入1,合并XXX-1
echo.
echo 输入2,合并XXX-1
echo.

set /p user_input=请输入数字:
if %user_input% == 0 exit
if %user_input% == 1 goto xxx-1
if %user_input% == 2 goto xxx-2
echo 输入有误 pause goto 菜单 :xxx-1 set filePathSrc=D:xxx-1开发目录数据库脚本存储过程 set fileMerge=D:xxx-1开发目录数据库脚本数据库更新3.Procedure.sql call:公共合并方法 set filePathSrc=D:xxx-1开发目录数据库脚本函数 set fileMerge=D:xxx-1开发目录数据库脚本数据库更新4.Function.sql call:公共合并方法 pause goto 菜单 :xxx-2 set filePathSrc=D:xxx-2开发目录数据库脚本xxx-2库存储过程 set fileMerge=D:xxx-2数据库脚本xxx-2库3.Procedure.sql set sqlText=IF(DB_NAME() NOT LIKE 'XXX-2%%%%') BEGIN RAISERROR ('当前操作的数据库不是xxx-2库,脚本已取消!' , 16, 1); RETURN; END call:公共合并方法 "%sqlText%" pause goto 菜单 :公共合并方法 echo 开始合并%filePathSrc%*.sql if exist "%fileMerge%" del "%fileMerge%" if not "%~1"=="" echo %~1>>"%fileMerge%" for %%f in (%filePathSrc%*.sql) do ( echo 已添加:%%~nf%%~xf type %%f>>"%fileMerge%" echo.>>"%fileMerge%" ) echo 已合并至%fileMerge% goto:eof

花了两天鼓捣出来的bat脚本,可以合并存储过程,也学到了很多bat脚本的写法,隐去项目具体信息,精简一下放上来大家参考,脚本几个语法点:

1、上面几行是设置界面,可以设置宽高和颜色,我还是习惯黑白

2、冒号后面跟的标签点,可使用goto跳转

3、echo是显示,相当于print之类,echo.相当于换行

4、%user_input% 表示接收输入值,相当于Console.ReadLine()之类

5、pause是便于显示信息,类似Console.ReadKey()

6、set可赋值,直接用就可以,有些像js,后面的字符串不用加引号

7、call是调用函数

8、合并的存储过程前加了一句验证,使用DB_NAME()获取当前库名,避免脚本运行在其它库上。bat里给变量赋值不能换行,网上有些方法如加双引号或^之类,但我试了都不好使。好在用空格分隔的Sql脚本也可以正常执行,就是不方便阅读。

9、四个百分号%%%%是为了转义,两个%%转成%,本来两个就可以,但给函数传递参数时不知怎么回事一定要四个%才能最终转成一个%,可能是转义的转义

10、if exist XX del XX,是先删除文件

11、%~1是获取函数的第一个参数,后面的参数变化数字就行,那句判断表示如果有传参数进函数,则拼进文本的第一行

12、for循环,%%f表示循环里的局部变量,类似for(int i = 0。。。)的i

13、type %%f>>  表示把循环中的变量(本例中为相应SQL文件内容)写进指定路径的文本。>>表示追加,>表示替换

14、echo.>>  表示每个SQL文本追加后再加一个换行

15、函数结束用goto:eof

16、用goto跳转后,有些像switch,执行完会继续往下走,使用时要注意。现在很多脚本都支持goto,但都不建议使用,跳来跳去容易乱。bat我一时也没找到什么好方法,大家也都使用goto来跳转菜单。

17、bat对中文支持的很好,无论是标签还是路径使用中文都没问题

18、漏说了一个,%%~nf%%~xf,其中%%~nf表示文件名,%%~xf表示扩展名

今天打算再弄一个在文件夹里找相应规则文件名的bat脚本。比如某文件夹里都是按XXX-001.xxx命名的,从001一直到100,要找出中间有没有漏的,之前我都靠眼睛看,一个个数,现在试着用bat解决下,思路是双重循环,先循环1~100,再循环文件名,如果没找到相应的,就把当前值写到一个文本文件里。

原文地址:https://www.cnblogs.com/liuyouying/p/6361750.html