在Windows中,极少有人会椒通过批处理命令实现批量重命名,甚至与Linux传输数据、执行shell命令等,正好公司遇到这类需求,于是写了这个自动化脚本:
- 将下载到Windows服务器的应用集通过调用其他脚本进行分包
- 删除无效文件后对应用包目录进行重命名并标记需要重启的服务
- 将应用包复制到指定Linux服务器中的部署目录中
- 在Weblogic控制台部署完毕后回到脚本重启服务
备注:在Windows命令提示符中执行ssh/scp等命令是因为安装了Windows版的OpenSSH,安装并配置好环境变量即可。而且,Windows中的批处理能力跟Linux中相比真的好垃圾!!!
@echo off rem 待分发的程序包所在的目录 set srcBase=D:\Apps\directoryName rem 部署日志文件 set logFile=publish.log echo --------- %date% --------- >> %logFile% rem 检查需要使用的批量分包脚本 rem 批量分包脚本用于将统一打包的应用集分到相应的目录 set batName=batchName.bat if not exist %srcBase%\%batName% ( echo %time:~0,8% 批量分包脚本不存在 >> %logFile% exit ) rem 获取最后更新的目录 for /f "delims=" %%i in ('dir /b /ad /od "%srcBase%"') do set "str=%%~i" echo 确认最后更新的目录是否正确:%str% echo 若目录错误请直接关闭此窗口 pause echo %time:~0,8% 即将对目录%str%中的程序包进行分发 >> %logFile% rem 调用批量分包即本进行分包 set srcPath=%srcBase%\%str% :: srcPath是根目录中最新修改过的文件夹 set batFile=%srcPath%\%batName% :: 需要将批量分包脚本复制到指定目录中执行 set plugDir=%srcPath%\packages :: 统一打包的应用集所在的目录 if not exist %plugDir% ( echo %time:~0,8% 在%str%中没有待拆分的应用集 >> %logFile% exit 0 ) else ( echo %time:~0,8% 将批量分包脚本复制到%str%中 >> %1ogFile% copy %srcBase%\%batName% %batFile% echo %time:~0,8% 开始执行批量分包脚本 >> %logFile% cd %str% call %batFile% ) rem 删除程序所在目录中无效文件 for /f "delims=" %%j in ('dir /ad /b %srcPath%\^|sort /r') do ( rd "%%j" ) rd /S /Q %plugDir% del %batFile% cd .. echo %time:~0,8% 完成文件清理 >> %logFile% rem 将程序所在目录中的有效文件夹重命名并标记需要重启的服务 :: 涉及到的服务名:service1 service2 service3 :: 服务名与程序包所在的文件夹名称相同 set flag_service1=0 set flag_service2=0 set flag_service3=0 cd %str% for /f "delims=" %%j in ('dir /ad /b %srcPath%\^|sort /r') do ( set /a flag_%%j += 1 ren "%%j" "%%j_%str%" timeout /T 1 /NOBREAK ) cd .. echo %time:~0,8% 完成应用目录重命名 >> %logFile% rem 备份目标服务器中的程序包 set rmtUser=weblogic set rmtHost=10.10.100.100 set desPath=/home/weblogic/appPath/deploy/ set backCmd=mv *_*_* History/ ssh %rmtUser%@%rmtHost% "cd %desPath% && %backCmd%" echo %time:~0,8% 已完成目标服务器数据备份 >> %1ogFile% rem 将应用程序复制到目标服务器 scp -r %srcPath%\* %rmtUser%@%rmtHost%:%desPath% echo %time:~0,8% 已将程序包复制到目标服务器 >> %logFile% echo 现在可以登录控制台部署程序包了 pause rem 在控制面板部署完毕后重启服务 echo 如果不需要重启服务请关闭此窗口 pause set remoteHost1=10.10.100.101 :: serviceInHost1: service1 service2 set remoteHost2=10.10.100.102 :: serviceInHost2: service1 service3 if flag_service1 GTR 0 ( ssh %rmtUser%@%remoteHost1% "cd apps && ./restart service1" echo %time:~0,8% 已重启%remoteHost1%服务器的service1服务 >> %logFile% timeout /T 1 /NOBREAK ssh %rmtUser%@%remoteHost2% "cd apps && ./restart service1" echo %time:~0,8% 已重启%remoteHost2%服务器的service1服务 >> %logFile% timeout /T 3 /NOBREAK ) if flag_service2 GTR 0 ( ssh %rmtUser%@%remoteHost1% "cd apps && ./restart service2" echo %time:~0,8% 已重启%remoteHost1%服务器的service2服务 >> %logFile% timeout /T 3 /NOBREAK ) if flag_service3 GTR 0 ( ssh %rmtUser%@%remoteHost2% "cd apps && ./restart service3" echo %time:~0,8% 已重启%remoteHost2%服务器的service3服务 >> %logFile% timeout /T 3 /NOBREAK )
原创文章禁止转载:技术学堂 » 在Windows中使用批处理脚本将程序包分发至Linux服务器