使用BAT自動更新程序


由於歷史原因,原來寫的C/S程序,客戶端沒有自動更新的功能,需要手動的去拿U盤更新客戶端程序,且又無法增加這部分功能(由於網絡、客戶機都不屬於我們維護),才想到使用批處理來實現自動更新的功能整體框架,具體的少部分功能需要根據自己去調整。這里只列出一個自動更新程序的框架。

主要是由實現的功能如下:

1)使用Web服務器發布新程序的壓縮包和更新配置文件

2)更新配置文件使用文本文件,為鍵/值對配置。

3)更新情況的業務流程:下載配置  → 讀取新舊配置文件 → 新舊版本對比 → 下載新版本zip包 → 備份 → 解壓 → 保存最新配置 → 啟動客戶端程序

 

后續優化:可以指定客戶端(根據IP)進行更新,其他客戶端使用本地版本程序 

流程圖:

配置文件updateInfo.txt內容,如下:

代=碼

version=1.2.3.4
url=http://127.0.0.1/1.2.3.zip
aaa=123abc

 

保存文件為:autoUpdate.bat(請使用ANSI格式),框架具體代碼如下:

代==碼
@echo off
::Mode con cols=47 lines=15
Title 自動更新批處理(風險動作)
cls
set V_main=20220225
set Is_Debug=0
echo.
echo Version:%V_main%
echo.
if /i %Is_Debug% GTR 0 (echo 調試模式:True) else echo 調試模式:False
echo.
echo.
echo                   正在初始化
echo.
echo.                 ...請稍等...
echo.
echo.
echo 本程序需要使用 【%cd%】 為工作目錄。
echo.
echo 所有文件操作均在工作目錄,請確認是否繼續?[Y/N]
echo.
set confim=N
set /p confim=請選擇 [Y/N]: 
if /i not "%confim%"=="y" echo,&echo 程序已退出&exit/b
echo.
echo.
echo 本程序正在執行中,請稍候......
echo.
echo.
call :main
exit/b


rem 主程序開始
:main
set newV=.
set oldV=.
set oldConfig=autoUpdated.txt
set newConfig=.
set urlPath="http://127.0.0.1/updateInfo.txt"
call :Web_DownloadFile %urlPath% "" newConfig
echo =newConfig =%newConfig%
call :getKeyVal %newConfig% "version" newV
echo =new version = %newV%
if exist %oldConfig% call :getKeyVal %oldConfig% "version" oldV
echo =old version = %oldV%
setlocal EnableDelayedExpansion
if /i not "%oldV%"=="%newV%" (
    echo =正在下載新版本,並覆蓋現有程序。
    ping 127.1>nul
    call :getKeyVal %newConfig% "url" valUrl
    echo =new url = !valUrl!
    call :Web_DownloadFile !valUrl! "" newZipFile
    echo =newZipFile=!newZipFile!
    call :getTimeStamp ts
    echo =ts=!ts!
    call :mkZip_Files "%cd%" ".\Bak\!ts!_bak.zip" 
    call :unZip_Files !newZipFile! ".\"
    copy "%newConfig%" "%oldConfig%" /y >nul
)
setlocal DisableDelayedExpansion

pause
exit/b

start "launch" "start.bat"
exit/b
rem 主程序結束



:mkZip_Files <ysPath> <zipFilePath>
title Zip 文件壓縮  %date:~5,2%月%date:~8,2%日 %time:~0,2%時%time:~3,2%分%time:~6,2%秒
if /i %Is_Debug% GTR 0 echo %0
if /i "%~1."=="." (echo 待壓縮包文件為空。&(if /i not %3.==. (set %3=null))&exit/b)
echo;
echo  正在壓縮:
echo;
set ysPath=%~1
set zipFilePath=%~2
if /i "%ysPath:~-1%"=="\" (set ysPath=%ysPath:~0,-1%)
for /f "delims=" %%i in ("%ysPath%") do (
set ysFolder=%%~dpi
set ysName=%%~ni
set ysExtension=%%~xi
)
if /i "%~2."=="." (set zipFilePath=%ysFolder%%ysName%.zip)
echo  壓縮路徑:"%ysPath%"
echo  保存路徑:"%zipFilePath%"
echo;
set zipVBS=MkZip.vbs
for %%a in (%zipVBS%) do (set localFolder=%%~dpa)
if not exist %localFolder% (md %localFolder%&echo 目錄 %localFolder% 已創建 )
echo Compress "%ysPath%","%zipFilePath%" >%zipVBS%
echo rem 壓縮文件>>%zipVBS%
echo Sub Compress^(ByVal mySourceDir,ByVal myZipFile^) >>%zipVBS%
echo     Const vOptions = 516 >>%zipVBS%
echo     Dim fso >>%zipVBS%
echo     Set fso = CreateObject^("Scripting.FileSystemObject"^) >>%zipVBS%
echo     If fso.GetExtensionName^(myZipFile^) ^<^> "zip" Then >>%zipVBS%
echo         Exit Sub >>%zipVBS%
echo     ElseIf fso.FolderExists^(mySourceDir^) Then >>%zipVBS%
echo         FType = "Folder" >>%zipVBS%
echo         sourcePath = mySourceDir >>%zipVBS%
echo     ElseIf fso.FileExists^(mySourceDir^) Then >>%zipVBS%
echo         FType = "File" >>%zipVBS%
echo         FileName = fso.GetFileName^(mySourceDir^) >>%zipVBS%
echo         sourcePath = Left^(mySourceDir, Len^(mySourceDir^) - Len^(FileName^)^) >>%zipVBS%
echo     Else >>%zipVBS%
echo         Exit Sub >>%zipVBS%
echo     End If >>%zipVBS%
echo     rem 處理路徑字符串標准化 >>%zipVBS%
echo     If left(sourcePath,1) = "." Then >>%zipVBS%
echo         sourcePath = Replace(wscript.ScriptFullName,wscript.ScriptName,"") ^& sourcePath >>%zipVBS%
echo     End If >>%zipVBS%
echo     sourcePath=Replace(Replace(Replace(Replace(sourcePath,"\\","\"),"//","\"),"/","\"),"\.\","\") >>%zipVBS%
echo     zipFile = myZipFile >>%zipVBS%
echo     If left(zipFile,1) = "." Then >>%zipVBS%
echo         zipFile = Replace(wscript.ScriptFullName,wscript.ScriptName,"") ^& zipFile >>%zipVBS%
echo     End If >>%zipVBS%
echo     zipFile=Replace(Replace(Replace(Replace(zipFile,"\\","\"),"//","\"),"/","\"),"\.\","\") >>%zipVBS%
echo     tagFolder = left(zipFile,InStrRev(zipFile,"\")-1) >>%zipVBS%
echo. >>%zipVBS%
echo     Set objShell = CreateObject^("Shell.Application"^) >>%zipVBS%
echo     Set objTargFolder = objShell.NameSpace(tagFolder) >>%zipVBS%
echo     If (objTargFolder is nothing) Then >>%zipVBS%
echo         objShell.NameSpace(left(tagFolder,2)^&"\").NewFolder(right(tagFolder,len(tagFolder)-3)) >>%zipVBS%
echo     End If >>%zipVBS%
echo     Set f = fso.CreateTextFile^(zipFile, True^) >>%zipVBS%
echo     f.Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, Chr^(0^)^) >>%zipVBS%
echo     f.Close >>%zipVBS%
echo     Set objSource = objShell.NameSpace(sourcePath) >>%zipVBS%
echo     Set objTarget = objShell.NameSpace^(zipFile^) >>%zipVBS%
echo     Select Case Ftype >>%zipVBS%
echo     Case "Folder" >>%zipVBS%
echo         Set objFolderItem = objSource.Items^(^) >>%zipVBS%
echo     Case "File" >>%zipVBS%
echo         Set objFolderItem = objSource.ParseName^(FileName^) >>%zipVBS%
echo     End Select >>%zipVBS%
echo     objTarget.CopyHere objFolderItem, vOptions >>%zipVBS%
echo     Do >>%zipVBS%
echo         WScript.Sleep 1000 >>%zipVBS%
echo     Loop Until objTarget.Items.Count ^> 0 >>%zipVBS%
echo. >>%zipVBS%
echo     rem 刪除壓縮包中指定文件或文件夾,以下硬編碼排除文件或文件夾 >>%zipVBS%
echo     objExcludeList= Array("MkZip.vbs","Bak","Downloads") >>%zipVBS%
echo     tmpFolder = left(zipFile,len(zipFile)-4) >>%zipVBS%
echo     Set fso = CreateObject("Scripting.FileSystemObject") >>%zipVBS%
echo     If not (fso.FolderExists(tmpFolder)) Then >>%zipVBS%
echo         Set f = fso.CreateFolder(tmpFolder) >>%zipVBS%
echo     End If >>%zipVBS%
echo     set tmpTarget = objShell.NameSpace(tmpFolder) >>%zipVBS%
echo     For Each tagItem In objTarget.Items >>%zipVBS%
echo         For Each exItem In objExcludeList >>%zipVBS%
echo             if tagItem = exItem then >>%zipVBS%
echo                 tmpTarget.MoveHere tagItem,vOptions >>%zipVBS%
echo             end if >>%zipVBS%
echo         Next >>%zipVBS%
echo     Next >>%zipVBS%
echo     If (fso.FolderExists(tmpFolder)) Then >>%zipVBS%
echo         fso.DeleteFolder tmpFolder,true >>%zipVBS%
echo     End If >>%zipVBS%
echo. >>%zipVBS%
echo End Sub >>%zipVBS%
::cscript //nologo %zipVBS% 2>nul
del /f /q %zipVBS% >nul 2>nul
echo;
echo  壓縮完畢
echo;
echo  壓縮路徑:"%ysPath%"
echo  保存路徑:"%zipFilePath%"
echo;
(if /i not %3.==. (set %3="%zipFilePath%"))&exit/b


:unZip_Files <zipFile>,<unZipPath>
title Zip 文件解壓縮  %date:~5,2%月%date:~8,2%日 %time:~0,2%時%time:~3,2%分%time:~6,2%秒
if /i %Is_Debug% GTR 0 echo %0
if /i "%~1."=="." (echo 壓縮包文件為空。&(if /i not %3.==. (set %3=null))&exit/b)
echo;
echo  正在解壓縮:
echo;
set zipFile=%~1
set unZipPath=%~2
for /f "delims=" %%i in ("%zipFile%") do (
set zipFolder=%%~dpi
set zipName=%%~ni
set zipExtension=%%~xi
)
if /i "%~2."=="." (set unZipPath=%zipFolder%%zipName%)
echo  壓縮文件:"%zipFile%"
echo  釋放路徑:"%unZipPath%"
echo;
if /i not "%zipExtension%"==".zip" (
    echo;
    echo  解壓縮失敗
    echo;
    echo  文件 "%zipFile%" 不是 Zip 壓縮文件
    echo;
    (if /i not %3.==. (set %3=null))&exit/b
)
set unZipVBS=UnZip.vbs
for %%a in (%unZipVBS%) do (set localFolder=%%~dpa)
if not exist %localFolder% (md %localFolder%&echo 目錄 %localFolder% 已創建 )
echo DeCompress "%zipFile%","%unZipPath%" >%unZipVBS%
echo rem 解壓縮文件,壓縮包路徑和解壓目標文件夾請使用絕對路徑>>%unZipVBS%
echo Sub DeCompress^(Source,Target^) >>%unZipVBS%
echo     Const vOptions=532 >>%unZipVBS%
echo     Dim ShApp,objSour,objTarg,oItem >>%unZipVBS%
echo     Set ShApp=CreateObject^("Shell.Application"^) >>%unZipVBS%
echo     zipFile = Source >>%unZipVBS%
echo     If left(zipFile,1) = "." Then >>%unZipVBS% 
echo         zipFile = Replace(wscript.ScriptFullName,wscript.ScriptName,"") ^& zipFile >>%unZipVBS%
echo     End If >>%unZipVBS%
echo     zipFile=Replace(Replace(Replace(Replace(zipFile,"\\","\"),"//","\"),"/","\"),"\.\","\") >>%unZipVBS%
echo     tagFolder = Target >>%unZipVBS%
echo     If left(tagFolder,1) = "." Then >>%unZipVBS%
echo         tagFolder = Replace(wscript.ScriptFullName,wscript.ScriptName,"") ^& tagFolder >>%unZipVBS%
echo     End If >>%unZipVBS%
echo     tagFolder=Replace(Replace(Replace(Replace(tagFolder,"\\","\"),"//","\"),"/","\"),"\.\","\") >>%unZipVBS%
echo     Set objTarg=ShApp.NameSpace(tagFolder) >>%unZipVBS%
echo     If (objTarg is nothing) Then >>%unZipVBS%
echo         ShApp.NameSpace(left(tagFolder,2)^&"\").NewFolder(right(tagFolder,len(tagFolder)-3)) >>%unZipVBS%
echo     End If  >>%unZipVBS%
echo     Set objSour=ShApp.NameSpace^(zipFile^) >>%unZipVBS%
echo     Set objTarg=ShApp.NameSpace^(tagFolder^) >>%unZipVBS%
echo     For Each oItem In objSour.Items >>%unZipVBS%
echo         objTarg.CopyHere oItem,vOptions >>%unZipVBS%
echo     Next >>%unZipVBS%
echo     Set ShApp=Nothing >>%unZipVBS%
echo End Sub >>%unZipVBS%
::cscript //nologo %unZipVBS% 2>nul
del /f /q %unZipVBS% >nul 2>nul
echo;
echo  解壓縮完畢
echo;
echo  壓縮文件:"%zipFile%"
echo  釋放路徑:"%unZipPath%"
echo;
(if /i not %3.==. (set %3="%unZipPath%"))&exit/b


:getKeyVal <localConfig> <key> [ret]
title 讀取更新配置文件  %date:~5,2%月%date:~8,2%日 %time:~0,2%時%time:~3,2%分%time:~6,2%秒
if /i %Is_Debug% GTR 0 echo %0
set kvFile=%~1
if /i "%~1."=="." (echo   配置文件路徑為空。&(if /i not %3.==. (set %3=null))&exit/b)
if /i "%~2."=="." (echo   查找關鍵字為空。&(if /i not %3.==. (set %3=null))&exit/b)
for /f %%a in (%kvFile%) do (
    for /f "tokens=1,* delims=:=" %%i in ("%%a") do (
        if /i %~2==%%i ((if /i not %3.==. (set %3=%%j))&exit/b)
    )
)
(if /i not %2.==. (set %2=""))&exit/b
::goto :eof


:Web_DownloadFile <url> <saveFOlderPath> [ret]
title 下載文件  %date:~5,2%月%date:~8,2%日 %time:~0,2%時%time:~3,2%分%time:~6,2%秒
if /i %Is_Debug% GTR 0 echo %0
if /i "%~1."=="." (echo 下載的URL路徑為空。& goto :eof)
set url=%~1
set urlFileName=%~nx1
set saveFilePath=%~2
if /i "%saveFilePath%"=="" (set saveFilePath=.\Downloads\)
if /i not "%saveFilePath:~-1%"=="\" (set saveFilePath=%saveFilePath%\)
set saveFilePath=%saveFilePath%%urlFileName%
for %%a in ("%saveFilePath%") do (set localFolder=%%~dpa)
if not exist "%localFolder%" (md "%localFolder%"&echo 目錄 "%localFolder%" 已創建 )
set vbDownFile="%windir%\System32\Web_Download.vbs"
set vbDownFile=Web_Download.vbs
echo rem The usage is as follow (CMD):cscript //NoLogo /e:vbscript %vbDownFile% "Web download's URL" "your save file's path" >%vbDownFile%
echo Set Web_Download = CreateObject("Microsoft.XMLHTTP") >>%vbDownFile%
echo     Web_Download.Open "GET",Wscript.Arguments.Item(0),0 >>%vbDownFile%
echo     Web_Download.Send() >>%vbDownFile%
echo Set Web_Save = CreateObject("ADODB.Stream") >>%vbDownFile%
echo     Web_Save.Mode = 3 >>%vbDownFile%
echo     Web_Save.Type = 1 >>%vbDownFile%
echo     Web_Save.Open() >>%vbDownFile%
echo     Web_Save.Write(Web_Download.responseBody) >>%vbDownFile%
echo     Web_Save.SaveToFile Wscript.Arguments.Item(1),2 >>%vbDownFile%
echo     Web_Save.Close() >>%vbDownFile%
cscript //NoLogo /e:vbscript %vbDownFile% "%url%" "%saveFilePath%" 2>nul
del /f /q %vbDownFile% 2>nul
(if /i not %3.==. (set %3="%saveFilePath%"))&exit/b
::goto :eof


:getTimeStamp <ret>
title 獲取當前時間戳
if /i %Is_Debug% GTR 0 echo %0&echo %date% %time%
for /f "tokens=1,2,3,4,5,6,* delims=-/\:." %%a in ("%date%-%time%") do (if /i not %1.==. (set %1=%%a%%b%%c%%d%%e%%f)&exit/b)
&exit/b

 代碼很簡單,你一看就懂的,可以根據自己的業務需要自行修改代碼。

當然,你也可以把你的需求告訴給我,我幫你修改也行,有償修改!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM