序
写了一年的python,以至于需求到来下意识就考虑python如何实现,java的老本行是彻底丢了,甚至在意识到组里不存在linux环境、不使用任何数据库时,充满了不解与丝丝的失落。
windows进行python开发?总觉得很low很鸡肋呀。。。
离开数据库,使用文件处理数据?那么数据量一定不大啊。。。
各种脚本和CI处理?之前web开发经验看来是用处不大咯。。。
批处理
进组后第一个熟悉业务以外的任务—实现一键脚本部署管理。
需求
- 统一管理目前各部署机上的各个脚本
- 实现多台机器远程一键部署,无需逐台访问
功能
- 添加注册表文件
- 将批处理文件加入windows任务计划
- 为批处理创建桌面快捷方式
- 记录处理过程到日志文件
实现
由于设计的初衷是省去原本一台一台编译机的环境部署,故统一管理脚本应该run在本地而非编译机,否则每次同样需要远程进行脚本的初始化。
因此需求即python程序跑在本地,通过remote连接方式调用每台编译机上的部署脚本进行执行,但是很遗憾由于内部对机器的管理,不允许开放远程登录,python wmi模块必须在remote情况下才可以调用目标机器的批处理执行。
最终方案:实现批处理统一管理全部部署操作,分别登录机器进行该批处理文件的执行操作
注册表文件添加
regedit /s XXXXX.reg
Task Schedule添加
schtasks命令可进行计划任务的添加、删除等操作,具体用法可以通过?命令进行查询。
schtasks /create /ru administrator /sc onlogon /tn taskname /tr taskfile /F
- create:表示创建计划任务
- ru:表示以什么用户执行任务
- sc:表示任务频率,这里指登录即执行
- tn:表示任务名称
- tr:表示执行任务的路径
- F:表示强制创建并忽略警告
创建桌面快捷方式
利用call命令实现批处理程序间的调用,并且不终止父批处理程序:
call shortcut.bat filePath fileName
快捷方式生成批处理文件,参数为目标文件路径和名称:
@echo off set targetFile=%1 set targetFileName=%2 set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs" echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT% echo sLinkFile = "%USERPROFILE%\Desktop\%targetFileName%-Shortcut.lnk" >> %SCRIPT% echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT% echo oLink.TargetPath = "%targetFile%" >> %SCRIPT% echo oLink.Save >> %SCRIPT% cscript /nologo %SCRIPT% del %SCRIPT%
日志处理
将批处理过程信息打印,输出到日志文件,有几点需要注意:
文件追加使用
>>
符号,2表示错误输出,文件输出到abc.log的同时,错误输出到error.log中:xxx >> abc.log 2>>error.log
文件覆盖使用
>
符号,结尾符号表示将错误输出2重定向到标准输出1后,写入abc.log中:xxx > abc.log 2>&1
往日志文件中写入空行:
echo. > abc.log
关机操作
使用shutdown命令可以关闭、重启或注销本地和远程计算机,以下命令表示立刻(0)关闭(-s)并重启(-t)当前计算机:
shutdown -r -t 0
注意事项
由于批处理文件之前接触不多,难免解决过程中会遇到些坑,比如目录路径有空格、接受用户输入参数、批处理参数引用写法等:参数路径中包含空格时,需要加上
""
双引号进行处理,当然如果能尽量保证文件命名不含空格为最佳:"C:\tools\Grid Server\%grid_node_name%.bat"
提供用户交互界面,接收用户输入参数,使用set命令:
set /p param=Please input file you want to run:
尾
虽然因为种种原因未能实现当初的需求,但是还是对批处理文件的一些操作有了较为熟练的了解,能够快速地写出一些简单的脚本来帮助我们更好的处理一些小的需求。
其实python也好,java也罢,批处理也行,关键是解决问题的方法和思路,还是那句老话,不管白猫黑猫,能抓住老鼠的就是好猫。当然很多时候我们需要结合当前的资源、时间等,找出符合目前需求的最优解。
总之条条大路通罗马,just do it