傻瓜bat脚本实现包管理和包引用——如何优雅的管理bat脚本集(一)
因为管理公司AD林需要,比如远程数据库的热备,冷备等,本来是使用付费工具实现的,但是系统重装以后丢失了注册码,又不愿意重新付费,所以不得不自己写个bat脚本来常驻实现,然后bat脚本多了以后,又想如何优雅的管理。。。
同系列文章目录
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
吐槽大会
测试代码下载地址:
实现bat脚本封装接口,可以自动判断是否需要向下传参
上次说到要实现增量备份,这个实现方式已经写了,但是代码部分由于我自己用不到,所以没提供下载,这个代码下次我自己用到了再补。
时隔一年,企业域管理林的时候遇到脚本散乱,分开读取太麻烦的问题,所以不得不再写个聚合读取脚本,比如像下面这样
所以首先要建立一个可以交互的main界面,然后封装一个bat版本的调取另一个bat文件的接口,所以可能有以下三种调取形式:
情景一:两个bat文件在同一个目录下
情景二:两个bat文件不在同一个目录下
情景三:开启一个新的cmd窗口来运行另一个bat文件
百度了一下在CSDN找到下面这个文章
提示:以下是本篇文章正文内容,下面案例可供参考
一、思路&实现&复杂
和所有的编程语言一样,bat是可以实现包的引入和管理的(所有的高级语言都这样),所以bat脚本的管理的高级应用其实就是包管理和包引用。
但越是这样 ,代码的复杂程度就越高
1、实现引入库
1.1、封装脚本文件读取接口
1.2、设计简单的交互界面,用户可选择root路径下(相对路径关系root为main.bat的根目录)指定名称的脚本来运行
1.3、设置暂存区和垃圾回收机制
2、实现包管理
2.1、封装包管理woker脚本:其目的是实现根目录下所有的脚本读取,并提取脚本文件名,自动生成本地闭包的脚本调用参数文件。
2.2、包管理main脚本:从暂存区读取woker脚本中生成的参数文件,实现对根目录下方的脚本统一化管理,并配合1.1的调用接口在1.2的交互界面实现随心调用
二、实现步骤
上面所有的内容都是听君一席话犹如听君一席话,完全不用管,注意下面就好
1.封装脚本文件读取接口(重新打开一个窗口)
命名规则:为了格式化自动化脚本,脚本的name必须存放在对应name的文件夹下。比如交互界面输入参数atSql,读取接口应该读取打开的脚本相对路径应该是
:getRunBat
rem 封装bat的调用不同目录的脚本的接口
@echo off
set choice=
set /p choice= 请输入需要调用的脚本名:
rem %~dp0取值默认自带后缀\
set root=%~dp0
REM 指定脚本库的相对位置,拼接成脚本库路径设置到变量中
set batwkdir= %root%tools\%choice%\
REM 执行调用另一个窗口
echo now run the "%choice%".bat
cd /d %batwkdir%
start "to Run bat如果没用执行权限请设置成管理员模式" cmd /k call %choice%.bat
pause
cls
goto menu
测试实现的效果如下:
2.封装脚本文件读取接口,并传参(重新打开一个窗口)
重点在这里,要能传参,把1上面的代码改变一下,增加传参的变量,传参到下一个脚本
6.Call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签
。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法:
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数:
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
7.start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE不等应用程序终止就返回命令提示。如果在命令脚本
内执行,该新行为则不会发生。
REM 在start ts.bat 111 这种形式会把参数111传入下一个被调用的脚本,
要传参救用start来呼起下一个脚本,不需要传参的直接用call呼起效率更高
cmd /k start %choice%.bat %choiceTT%
套娃来了
:getRunBat
rem 封装bat的调用不同目录的脚本的接口
@echo off
set choice=
set /p choice= 请输入需要调用的脚本名:
set choiceTT=
set /p choiceTT= 请输入需要参数,如没用可以直接回车:
rem %~dp0取值默认自带后缀\
set root=%~dp0
REM 指定脚本库的相对位置,拼接成脚本库路径设置到变量中
set batwkdir= %root%tools\%choice%\
REM 执行调用另一个窗口
echo now run the "%choice%".bat
cd /d %batwkdir%
REM 在start ts.bat 111 这种形式会把参数111传入下一个被调用的脚本,
REM 要传参需要用start来呼起下一个脚本,不需要传参的直接用call呼起效率更高
REM 下面的命令其实有两条套娃命令,第一条start调用一个新cmd,然后传参为/k start %choice%.bat
REM 第二条start调用一个%choice%.bat,然后传参为%choiceTT%
start "to Run bat如果没用执行权限请设置成管理员模式" cmd /k start %choice%.bat %choiceTT%
pause
cls
goto menu
总结
如何优雅的管理bat代码,从缩小main脚本中的代码开始:
比如一个使用的bat交互脚本,有140行,其中包括main小节,交互界面小节,和其他功能小节,这样太多了不优雅,如何优雅的使用:
1、首先入口bat只需要保留mani小节和交互小节
这样基本上一个入口bat只需要10多行代码了
2、然后入口bat上只需要一次性注册有关变量即可,比如直接注册好%temp%,%logs%,%choice%等,这样自然就能很优雅的关闭内存并导出统一的log记录
3、入口bat的调取脚本接口要能传参,这个传参就是套娃,可以依次传参实现更多的业务。(bat脚本传参是包调用的核心)
例子:main 调用getFiles 传参 111
等于 main 调用 getFiles脚本中符合111规则的小节
下面是接收传参的代码
REM 在start ts.bat 111 这种形式会把参数111传入下一个被调用的脚本,
REM 要传参需要用start来呼起下一个脚本,不需要传参的直接用call呼起效率更高
REM 下面的命令其实有两条套娃命令,第一条start调用一个新cmd,然后传参为/k start %choice%.bat
REM 第二条start调用一个%choice%.bat,然后传参为%choiceTT%
start "to Run bat如果没用执行权限请设置成管理员模式" cmd /k start %choice%.bat%choiceTT%