批处理脚本bat丨遍历一个包含项目名称的数组,并对每个文件中的项目执行 git pull 操作 (一键拉很多文件的代码)
文章目录
- 前言
- 一、操作方式
- 二、文件展示
- 三、分析代码结构
- 四、代码
- 五、需要注意的潜在问题
- 六、改进后的代码
- 七、改进说明
- 八、感谢
前言
由于之前git服务部署在本地服务器,处于代码安全角度考虑。领导让我将所有的项目代码手动物理备份一份并且发给他。
这种傻傻的操作太浪费时间了,所以我就写了一个批处理脚本用来执行这种操作。
解决方案:遍历一个包含项目名称的数组,并对每个文件中的项目执行 git pull 操作。
一、操作方式
window 系统新建一个 txt 文件,然后把下面代码粘贴进去,点击执行就开始了。
二、文件展示
这个文件要和其他项目文件放在一个同级。
文件名要和执行脚本中的数组值保持一致。
三、分析代码结构
首先,代码开始处声明了编码为65001(UTF-8),并开启了echo,显示命令的输出。然后定义了一个数组obj,包含7个项目名称。通过循环遍历数组,对每个项目切换到对应的目录并执行git pull。
- 数组定义:使用set命令定义数组元素,索引从0到6。
- 循环逻辑:使用标签:loopStart和goto实现循环,索引从0开始,直到等于数组长度时结束。
- 变量处理:使用for/f循环获取数组元素的值,赋值给objCurrent。
- 目录切换和git操作:cd到对应目录并执行git pull。
- 索引递增:每次循环后索引加1。
四、代码
::代码声明编码
chcp 65001
@echo on
::规定数组长度
set objLength=7
::给数组设值
set obj[0]=BasicFramework0
set obj[1]=BasicFramework1
set obj[2]=BasicFramework2
set obj[3]=BasicFramework3
set obj[4]=BasicFramework4
set obj[5]=BasicFramework5
set obj[6]=BasicFramework6::初始索引
set objIndex=0::循环
:loopStart
::判断索引值是否大于数组长度,大于的话跳到结束,不大于的话继续循环
if %objIndex% equ %objLength% goto end::初始化变量
set objCurrent=0
for /f "usebackq delims== tokens=1-2" %%i in (`set obj[%objIndex%]`) do (:: 赋值变量set objCurrent=%%j
):: 拉代码
cd D:\git\%objCurrent%
git pull::索引+1
set /a objIndex=%objIndex% + 1
::继续循环
goto loopStart:endpausecmd /k
五、需要注意的潜在问题
- 数组长度和索引是否正确处理,特别是当数组元素数量变化时。
- 目录路径是否正确,特别是如果项目目录名称包含空格或特殊字符时,是否需要引号。
- git命令的执行是否需要错误处理,例如网络问题或权限问题。
六、改进后的代码
chcp 65001 >nul
@echo off
setlocal enabledelayedexpansion:: 动态获取数组长度
set objLength=0
for /f "tokens=2 delims==" %%a in ('set obj[') do set /a objLength+=1:: 带进度条和错误处理的更新
set objIndex=0
:loopStart
if %objIndex% geq %objLength% goto :endcall :get_array_element objCurrent %objIndex%
echo [%time%] 正在更新:!objCurrent!cd /D "D:\git\!objCurrent!" 2>nul || (echo [错误] 目录不存在:!objCurrent!goto :next
)git pull >> update.log 2>&1
if %errorlevel% neq 0 (echo [失败] !objCurrent! >> error.log
) else (echo [成功] !objCurrent!
):next
set /a objIndex+=1
goto loopStart:end
echo 所有仓库更新完成
pause
exit:: 获取数组元素子程序
:get_array_element <return_var> <index>
set %1=!obj[%2]!
exit /b:: 显示进度条子程序
:show_progress <percentage>
set /a width=40
set /a pos=%1*width/100
set bar=▓
call :build_bar %pos%
echo [进度:%1%%] [!bar!]
exit /b:build_bar
set bar=
set /a len=%1
for /l %%i in (1,1,%len%) do set bar=!bar!▓
exit /b
七、改进说明
- 自动检测数组长度,无需手动维护objLength;
- 添加错误处理和日志记录功能;
- 引入进度条可视化更新进度;
- 增强路径处理安全性;
- 支持中文路径和特殊字符;
- 添加时间戳记录操作日志;
使用时只需维护 obj[n]=仓库名 数组即可,脚本会自动处理后续更新操作。
八、感谢
如果觉得有用欢迎点赞关注收藏。
有问题私信我!!~~