前言
自制的Winform小工具,不到1MB,局域网内多人使用。
在功能更新/修复bug时,如果挨个发新包,显得过于愚蠢。
所以制作了自动更新功能。
说白了就是自动执行【下载最新版,替换,打开】这套流程。
注意:大概率是取巧方式,只是凑巧能用
一、思路
- 1、程序发布时,
- 1.1、包名和版本号就已经确定了(写在代码里-_-||)。
- 1.2、上传到更新服务器中,我这里用的是FTP,然后用TXT记录包名和对应的最新版本号。
- 2、程序运行,
- 2.1、获取当前程序进程id,用于后续更新时KILL。
- 2.2、去FTP下载TXT,比对版本。
- 3、点击更新,
- 3.1、下载最新的EXE到TEMP,
Path.GetTempFileName()
- 3.2、运行cmd,执行:关闭自己,移动并覆盖文件,重新打开。
- 3.1、下载最新的EXE到TEMP,
- 完成更新。
之所以这么做,主要的一点,小工具的发布模式是单个文件
。
常理来说,应该是另外有个update.exe
,需要更新时去启动它。
我这里相当于用cmd.exe
代替了update.exe
的工作。
二、功能实现
&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面
&&,表示必须前一个命令执行成功才会执行后面的命令
||,表示必须前一个命令执行失败才会执行后面的命令
|,表示前一个命令输出结果作为后一个命令的参数使用
/C,执行字符串指定的命令,然后终止
string[] cmds = new string[]
{
$"taskkill /pid {processId} /f&&",// /f 指定强制结束进程。成功继续
$"timeout /t 2&",//等个2秒
$"tasklist | findstr \"{processId}\"||",//找不到才继续
$"move /y {sourcesFileName} {destFileName}&&",// /y 不提示覆盖。成功继续
$"start {destFileName}&",
$"timeout /t 3",//等个3秒,然后结束
};
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = @$"/C {string.Join("", cmds)}";
p.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
p.StartInfo.CreateNoWindow = false;//显示程序窗口
p.Start();//启动程序