本帖最后由 wlsk888 于 2019-9-16 17:35 编辑
我在新更新一个易语言 软件后,老是需要手动上传某服务器,给别人提供更新,有时更新忘记了上传,有时忘记本地和服务器版本有没有更新过
麻烦,所以有了下面一个小技巧
方法很简单,先写个sc.bat上传批处理(需要用到一个curl的小工具,支持多种方式,以下以ftp为例子,大家可以网上找)
把它放到你的需要更新的程序目录
rem 需要自己修改的如下:
rem <服务器网址>
rem <软件名称>
rem <ftp用户名>
rem <ftp密码>
rem <ftp网址>
rem <ftp目录>
setlocal disabledelayedexpansion
set version=%%i
setlocal enabledelayedexpansion
)
del DE_Version_tmp.txt
if "%version%"=="" goto :err
echo 当前版本为:%version%
if exist 已上传版本.txt (goto :jcsc) else (
echo %version% >已上传版本.txt
goto :kssc
)
:jcsc
for /f "delims=" %%i in (已上传版本.txt) do (
setlocal disabledelayedexpansion
set oversion=%%i
setlocal enabledelayedexpansion
)
echo 已上传版本为:%oversion%
if %version%==%oversion% goto :bbcz
:kssc
echo 开始上传新版本,请等待完成...
echo 开始正常上传 >log.txt
echo <软件名称>-%version%-http://<服务器网址>/updown/<软件名称>.exe>up.txt
@ping 127.0.0.1 -n 2 >nulcurl -s -T <软件名称>.exe -u <ftp用户名>:<ftp密码> ftp://<ftp网址>/<ftp目录>/ >>log.txt
curl -s -T up.txt -u <ftp用户名>:<ftp密码> ftp://<ftp网址>/<ftp目录>/ >>log.txt
echo 上传完成 >>log.txt
echo %version% >已上传版本.txt
echo 新版本上传完成:%version%
@ping 127.0.0.1 -n 2 >nul
exit
:err
echo error
@ping 127.0.0.1 -n 3 >nul
echo error >log.txt
exit
:bbcz
echo 当前版本已上传过
@ping 127.0.0.1 -n 3 >nul
echo 当前版本已上传过 >log.txt
exit
:test
type 已上传版本.txt|findstr /i %version% >nul
if %errorlevel%==0 (echo 存在&pause) else (
echo 不存在
pause
)
rem 以上sc.bat批处理完成检查本目录下<软件名称>的版本,判断是否上传过,没有就自动上传,同时上传up.txt给服务器,帮助软件判断更新,最后在已上传版本.txt中记录,留给下次更新!
------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二步
找到易语言安装目录\tools\link.ini
在最后加上一行
post_link_action1=cmd.exe /c if exist $(TARGET_DIR)\sc.bat $(TARGET_DIR)\sc.bat
第三步,就是每次更新编译前易语言程序修改下配置中的程序版本号
最后给出我更新用的一部分代码,供参考
//启动时:
_启动窗口.标题 = “软件名称-” + 版本信息.产品版本
本地更新 = 读配置项 (配置文件, “Options”, “本地更新”, “0”)
.如果真 (本地更新 = “1”)
本地更新文件名 = 读配置项 (配置文件, “Options”, “本地更新文件名”, “”)
.如果真 (本地更新文件名 ≠ “”)
.如果真 (文件是否存在 (本地更新文件名) = 真)
写配置项 (配置文件, “Options”, “本地更新”, “0”)
写配置项 (配置文件, “Options”, “本地更新文件名”, “”)
程序自杀 (本地更新文件名)
.如果真结束
.如果真结束
.如果真结束
自动更新 = 读配置项 (配置文件, “Options”, “自动更新”, “0”)
.如果 (自动更新 = “1”)
_检查更新_被选择 ()
自动更新选择框.选中 = 真
.否则
自动更新选择框.选中 = 假
//版本比较:
变量名 类 型 静态 数组 备 注 本地版本数组 文本型 0 最新版本数组 文本型 0 length 整数型 i 整数型
如果真 ( 本地版本号 = 最新版本号
) 返回 ( 假 ) 本地版本数组 = 分割文本 ( 本地版本号, “.” , ) 最新版本数组 =
分割文本 ( 最新版本号,
“.” ,
) 如果 ( 取数组成员数 ( 本地版本数组
) <
取数组成员数 ( 最新版本数组
) )
变量循环首 ( 1,
取数组成员数 ( 最新版本数组
) -
取数组成员数 ( 本地版本数组
) , 1,
) 加入成员 ( 本地版本数组,
“0” ) 变量循环尾 ( ) length =
取数组成员数 ( 本地版本数组
) 变量循环首 ( 1,
取数组成员数 ( 本地版本数组
) -
取数组成员数 ( 最新版本数组
) , 1,
) 加入成员 ( 本地版本数组,
“0” ) 变量循环尾 ( ) length =
取数组成员数 ( 最新版本数组
) 计次循环首 ( length, i
) 判断 ( 到数值 ( 最新版本数组
[ i
] ) >
到数值 ( 本地版本数组
[ i
] ) )
返回 ( 真 ) 判断 ( 到数值 ( 最新版本数组
[ i
] ) <
到数值 ( 本地版本数组
[ i
] ) )
返回 ( 假 ) i = i + 1 计次循环尾 ( ) 返回 ( 假 )
//更新下载等
窗口程序集名 保 留 保 留 备 注 窗口程序集_窗口1 变量名 类 型 数组 备 注 需要销毁 逻辑型
变量名 类 型 静态 数组 备 注 当前程序名 文本型 当前版本号 文本型 更新字符串 文本型 0 更新字符数量 整数型 计次 整数型 需更新版本号 文本型 更新地址 文本型 标题分组 文本型 0
标题分组 =
分割文本 ( _启动窗口.标题,
“-” ,
) 当前程序名 = 标题分组
[ 1
] 当前版本号 = 标题分组
[ 2
] 更新字符串 =
分割文本 ( 到文本 ( HTTP读文件 ( “http://www.ymao888.cn/updown/up.txt” ) ),
“-” ,
) 更新字符数量 =
取数组下标 ( 更新字符串,
) 如果真 ( 更新字符数量 < 1
) 更新字符串 =
分割文本 ( 到文本 ( HTTP读文件 ( “http://wlsk888.gz01.bdysite.com/updown/up_bd.txt” ) ),
“-” ,
) 更新字符数量 =
取数组下标 ( 更新字符串,
) 如果真 ( 更新字符数量 > 1
) 计次循环首 ( 更新字符数量, 计次
) 如果真 ( 当前程序名 = 更新字符串
[ 计次
] ) 需更新版本号 = 更新字符串
[ 计次 + 1
] 如果真 ( 版本比对 ( 当前版本号, 需更新版本号
) =
真 ) 更新地址 = 更新字符串
[ 计次 + 2
] 跳出循环 ( ) 计次循环尾 ( ) 版本号.标题 = 当前版本号 如果真 ( 需更新版本号 =
“” ) 需更新版本号 = 当前版本号
版本号1.标题 = 需更新版本号 如果 ( 更新地址 =
“” ) 更新按钮.禁止 = 真
状态条1.
置文本 ( 0,
“当前为最新版本,无需更新” ) 需要销毁 = 真
更新按钮.禁止 = 假
状态条1.
置文本 ( 0,
“检测到最新版本,已获取更新地址,请点击更新” ) 编辑框1.内容 = 更新地址
如果真 ( 自动更新 =
“1” ) _更新按钮_被单击 ( ) 提示框 ( 状态条1.
取文本 ( 0
) , 0,
“更新检查” , , 3000
) 更新窗口.
销毁 ( ) 更新按钮.禁止 = 真
如果 ( 编辑框1.内容 ≠
“” ) API_CloseHandle ( API_CreateThread ( 0, 0,
到数值 ( &下载线程
) , 0, 0, 0
) )
更新按钮.禁止 = 假
变量名 类 型 静态 数组 备 注 Winhttp Winhttp 反馈 整数型 更新文件名 文本型 下载地址 文本型 下载文件名 文本型
下载地址 =
子文本替换 ( 编辑框1.内容,
#换行符, “” , , ,
真 ) 下载文件名 =
编码_URL编码 ( 文本_取右边 ( 下载地址,
“/” ) ,
真 ) 更新文件名 =
文本_取右边 ( 下载地址,
“/” ) +
“.tmp” 下载地址 =
子文本替换 ( 下载地址,
文本_取右边 ( 下载地址,
“/” ) , 下载文件名, , ,
真 ) 输出调试文本 ( 下载地址
) 输出调试文本 ( 更新文件名
) Winhttp.
Open ( “GET” , 下载地址
) Winhttp.
SetRequestHeader ( “Accept” ,
“*/*” ) Winhttp.
SetRequestHeader ( “Referer” , 下载地址
) Winhttp.
SetRequestHeader ( “User-Agent” ,
“ Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0” ) Winhttp.
Send ( ) 如果 ( Winhttp.
GoDownBody ( 取运行目录 ( ) , 更新文件名,
到数值 ( &进度显示
) , 123
) =
真 ) 输出调试文本 ( 取运行目录 ( ) )
如果真 ( 自动更新 =
“1” ) 状态条1.
置文本 ( 0,
“程序将自动重启,完成更新” ) 写配置项 ( 配置文件,
“Options” ,
“本地更新” ,
“0” ) 写配置项 ( 配置文件,
“Options” ,
“自动更新” ,
“0” ) 程序自杀 ( 更新文件名
) 返回 ( ) 反馈 = 提示框 ( “下载完毕,是否退出,并更新启动夜猫雷电群控?” , #是否钮, “下载完毕” , , 5000) 如果 ( 反馈 = 5
或 反馈 = 31999
) 状态条1.
置文本 ( 0,
“程序将自动重启,完成更新” ) 写配置项 ( 配置文件,
“Options” ,
“本地更新” ,
“0” ) 写配置项 ( 配置文件,
“Options” ,
“自动更新” ,
“0” ) 程序自杀 ( 更新文件名
) 状态条1.
置文本 ( 0,
“下载完毕,但没有更新,下次启动将自动更新” ) 写配置项 ( 配置文件,
“Options” ,
“本地更新文件名” , 更新文件名
) 写配置项 ( 配置文件,
“Options” ,
“本地更新” ,
“1” ) 状态条1.
置文本 ( 0,
“更新失败,请检查网络或联系作者” ) 更新按钮.禁止 = 假
进度显示 dwParam 整数型 dwSizetotes 长整数型 dwSize 长整数型 dwTime 长整数型
变量名 类 型 静态 数组 备 注 lpTimeoues 双精度小数型
判断 ( dwParam = 123
) 进度条1.位置 = dwSize ÷ dwSizetotes × 100
lpTimeoues
= ( dwTime × dwSizetotes ÷ dwSize - dwTime
) ÷ 1000
标签1.标题 =
“下载文件剩余用时:” +
到文本 ( 四舍五入 ( lpTimeoues, 2
) ) +
“ 秒” 如果真 ( 需要销毁 =
真 ) 提示框 ( “无需更新,立刻退出” , 0,
“更新检查” , , 3000
) 更新窗口.
销毁 ( )