// 重启太麻烦了,呵呵,改一改(利用wsh)。
procedure XCopy(Src, Dst: String);
function P2C(S: String);
String;
begin
// 将路径转成c格式的字符串
Result := StringReplace(S, '/', '//', [rfReplaceAll]);
end;
begin
with TStringList.Create do
try
Add('var Shell = WScript.CreateObject("WScript.Shell");');
Add('try{');
Add(' WScript.Sleep(2000);');
// 等待2秒,否则原程序可能还没关闭完毕
Add(' Shell.Run("cmd /C copy ' + P2C(Src) + ' ' + P2C(Dst) + '");');
//复制文件
Add(' Shell.Run("cmd /C del autoupdate.js");');
// 删除脚本自己
Add(' Shell.Run("' + P2C(Dst) + '");');
// 升级完毕,重新启动程序
Add(' WScript.Echo("升级成功。");}');
Add('catch(AnyError){');
Add(' WScript.Echo(AnyError.description);');
Add('}');
Add('Shell = null;');
SaveToFile('autoupdate.js');
finally
Free;
end;
end;
procedure TForm1.Button1OnClick(Sender: TObject);
begin
//这里假定ADownloadedFile已经下载
XCopy(ADownloadedFile, Application.ExeName);
//实质是生成一个js文件并执行之, 脚本一开始会先等待2秒,以便程序完成退出工作。
ShellExecute(0, 'open', 'autoupdate.js', nil, PChar(ExtractFilePath(Application.ExeName)), SW_SHOWNORMAL);
Close;
// 关闭程序
end;