傻瓜bat脚本实现包管理和包引用——如何优雅的管理bat脚本集(一)

因为管理公司AD林需要,比如远程数据库的热备,冷备等,本来是使用付费工具实现的,但是系统重装以后丢失了注册码,又不愿意重新付费,所以不得不自己写个bat脚本来常驻实现,然后bat脚本多了以后,又想如何优雅的管理。。。

同系列文章目录

第1部分 傻瓜bat脚本实现的远程数据备份


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 傻瓜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.封装脚本文件读取接口(重新打开一个窗口)
    • 2.封装脚本文件读取接口,并传参(重新打开一个窗口)
  • 总结
    • 测试代码下载地址:

吐槽大会

测试代码下载地址:
实现bat脚本封装接口,可以自动判断是否需要向下传参

上次说到要实现增量备份,这个实现方式已经写了,但是代码部分由于我自己用不到,所以没提供下载,这个代码下次我自己用到了再补。

时隔一年,企业域管理林的时候遇到脚本散乱,分开读取太麻烦的问题,所以不得不再写个聚合读取脚本,比如像下面这样
所以首先要建立一个可以交互的main界面,然后封装一个bat版本的调取另一个bat文件的接口,所以可能有以下三种调取形式:
情景一:两个bat文件在同一个目录下
情景二:两个bat文件不在同一个目录下
情景三:开启一个新的cmd窗口来运行另一个bat文件

百度了一下在CSDN找到下面这个文章

「雨临Lewis原创」- 浅谈如何在bat文件中调用另一个bat文件


提示:以下是本篇文章正文内容,下面案例可供参考

一、思路&实现&复杂

和所有的编程语言一样,bat是可以实现包的引入和管理的(所有的高级语言都这样),所以bat脚本的管理的高级应用其实就是包管理和包引用。
但越是这样 ,代码的复杂程度就越高

1、实现引入库

1.1、封装脚本文件读取接口

Created with Raphaël 2.3.0 启动运行接口 调用一个新的窗口来调用一个用户指定的脚本 确认? 结束 yes no

1.2、设计简单的交互界面,用户可选择root路径下(相对路径关系root为main.bat的根目录)指定名称的脚本来运行

Created with Raphaël 2.3.0 交互界面获取用户输入的命令或任意值 调用对应输入值的脚本 确认? 结束 yes no

1.3、设置暂存区和垃圾回收机制

Created with Raphaël 2.3.0 交互界面运行后调用初始化脚本 设置暂存区和logs路径、内存回收机制 确认? 结束 yes no

2、实现包管理

2.1、封装包管理woker脚本:其目的是实现根目录下所有的脚本读取,并提取脚本文件名,自动生成本地闭包的脚本调用参数文件。

Created with Raphaël 2.3.0 启动woker脚本 提取根目录下所有*.bat;*.cmd文件的路径记录到暂存区 确认? 结束 yes no

2.2、包管理main脚本:从暂存区读取woker脚本中生成的参数文件,实现对根目录下方的脚本统一化管理,并配合1.1的调用接口在1.2的交互界面实现随心调用

Created with Raphaël 2.3.0 start input string 获取用户指定参数 匹配参数:不存在参数文件/不存在该脚本 end 匹配参数:匹配成功 getBat 调用脚本读取接口 运行脚本 重新初始化参数 yes no yes no

二、实现步骤

上面所有的内容都是听君一席话犹如听君一席话,完全不用管,注意下面就好

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不等应用程序终止就返回命令提示。如果在命令脚本 内执行,该新行为则不会发生。

参考文件:《Windows .bat 脚本简单用法介绍》

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%

测试代码下载地址:

实现bat脚本封装接口,可以自动判断是否需要向下传参

傻瓜bat脚本实现包管理和包引用——如何优雅的管理bat脚本集(一)相关推荐

  1. android批处理脚本,BAT批处理一键生成APK包脚本分享

    BAT批处理一键生成APK包脚本分享 将本bat放到cocos2dx目录下你的工程的project.android下(需修改变量). ASmaker 用来将Resources文件夹下的lua文件批量加 ...

  2. python脚本开头怎么写_浅谈Python脚本开头及导包注释自动添加方法

    浅谈Python脚本开头及导包注释自动添加方法 1.开头:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定 #!/usr/bin/python 是用来 ...

  3. 一种混合包管理和容器管理方案,及在tinycorelinux上安装containerd和openfaas

    本文关键字:在tinycorelinux上装docker,virtual appliance vs virtual appstack,no cgroup mount found in mountinf ...

  4. 神经网络与深度学习——TensorFlow2.0实战(笔记)(二)(包管理和环境管理)

    包管理和环境管理(以下操作也可在anaconda界面,进行可视化操作) 包管理:包的安装.卸载.更新和查找等等 conda命令 conda install <包名称列表> 同时安装多个包 ...

  5. uPython - 分发包、包管理和部署应用程序 - 以 microdot 为例

    分发包.包管理和部署应用程序 - 以 microdot 为例 目录 分发包.包管理和部署应用程序 - 以 microdot 为例 概述 安装 mip 手动安装包 - microdot 参考资料 正如& ...

  6. 脚本批量打包渠道包研究

    上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一) 本篇文章我们将说说assetbundl ...

  7. linux系统软件包分类,Linux软件包管理和编译安装

    软件包介绍 开源软件最初只提供了.tar.gz的打包的源码文件,用户必须自已编译每个想在GNU/Linux上运行的软件.用户急需系统能提供一种更加便利的方法来管理这些软件,当Debian诞生时,这样一 ...

  8. js文件 import java类_实现JS脚本导入JAVA类包

    本例演示怎样通过JS脚本导入JAVA类包,我们创建JS引擎后,通过eval方法调用 getScript() ,JS脚本中importPackage(java.util)为导入包. package aj ...

  9. 让SH/BAT脚本定位到运行目录的相对位置,实现其脚本可在任意运行目录下被正确执行...

    让SH/BAT脚本定位到运行目录的相对位置 实现其脚本可在任意运行目录下被正确执行 在Linux下的bash脚本 #!/bin/bash cd `dirname $0` 在Windows下的BAT脚本 ...

最新文章

  1. 一个97年的IT人创业历程中的总结和感悟
  2. Post Content_Length exceeds the limit
  3. Linux部署禅道环境
  4. sql server 多条记录数据合并为一条_如何利用Python实现SQL自动化?
  5. 关于TCP/IP必须知道的几个基础问题
  6. (转)如何查看java本地方法
  7. [转]VI/VIM的键盘图
  8. 星星之火-57:前传接口 CPRI的速率、能力、小区带宽之间的映射关系
  9. Android App混合开发
  10. Kaggle注册及绑定手机号
  11. 一文读懂 HBase 使用场景
  12. 域名泛解析,二级域名转向问题- -完美解决
  13. STM32掌机教程8,背景音乐
  14. Todd Lammle's CCNA IOS Commands Survival Guide
  15. iOS开发中常用的方法
  16. Android 实现定位
  17. python网课期中答案_中国大学python答案网课期末慕课MOOC答案
  18. Kejin Player (概率DP)hdu6656
  19. 干掉Vivado幺蛾子(2)-- 快速替换debug probes
  20. tableau-去掉ABC方法

热门文章

  1. 论文引用标注在右上角的方式方法
  2. FSL——FDT数据统计处理TBSS
  3. pid控制中p、i、d各自作用
  4. Android手机WiFi下强制使用4G数据流量上网
  5. 数据库图形界面好用的软件~~Navicat
  6. 转:管理禁区把自己完全孤立、封闭起来
  7. Java API——容器(二)Queue
  8. 3-Cordova 常用插件
  9. 梳理常见基本的概率分布函数及他们在机器学习中的作用
  10. 微信公众号前后端分离项目网页授权登录问题