- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Inno Setup 删除程序的旧可能实例。该程序不必安装在系统的特定部分即可运行,但我想组成一个标准并通过复制文件来删除就在那里的旧实例。因为有一些变化,我想从注册表中删除以前安装的条目(32 位和 64 位安装是可能的,所以如果你想要两个安装程序,同一个程序可能存在两个条目),我在假设中写了这个安装将在 PrepareToInstall 部分运行卸载程序并删除文件后开始。
{ This is the part that is executed after you started the install }
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
ResultCode: integer;
UninstallString: String;
AppId: String;
begin
AppId := '{#SetupSetting("AppId")}';
AppId := Copy(AppId, 2, Length(AppId) - 1);
if (IsWin64 And RegQueryStringValue(HKEY_LOCAL_MACHINE_64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+'_is1', 'UninstallString', UninstallString)) then begin
Exec(Copy(UninstallString, 2, Length(UninstallString) - 2), '/VERYSILENT', '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
if RegKeyExists(HKEY_LOCAL_MACHINE_64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+'_is1') then begin
RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE_64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+'_is1')
end;
end;
if (RegQueryStringValue(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+'_is1', 'UninstallString', UninstallString)) then begin
Exec(Copy(UninstallString, 2, Length(UninstallString) - 2), '/VERYSILENT', '', SW_HIDE, ewWaitUntilTerminated, ResultCode)
if RegKeyExists(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+'_is1') then begin
RegDeleteKeyIncludingSubkeys(HKEY_LOCAL_MACHINE_32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\'+AppId+'_is1')
end;
end;
If (DirIsSysLink(ExpandConstant('{app}')) = True) Then begin
RenameFile(ExpandConstant('{app}'), ExpandConstant('{app}_link'));
CreateDir(ExpandConstant('{app}'));
DirectoryCopy(ExpandConstant('{app}_link'), ExpandConstant('{app}'));
DelTree(ExpandConstant('{app}_link'), True, True, True);
End;
If (IsWin64) Then Begin
If (DirExists('C:\Program Files (x86)\TargetProgram')) then begin
CleanupFolder('C:\Program Files (x86)\TargetProgram', 'X86')
If (DirIsSysLink('C:\Program Files (x86)\TargetProgram') = False) Then begin
DelTree('C:\Program Files (x86)\TargetProgram', True, True, True)
end
end;
End;
If (DirExists('C:\Program Files\TargetProgram')) then begin
CleanupFolder('C:\Program Files\TargetProgram', 'X64')
end;
end;
{ Tries to remove existing installations and additional files in the folders that don't belong here before install starts }
function CleanupFolder(Folder: String; Num: String): Boolean;
var
BolTmpVal: Boolean;
FindRec: TFindRec;
FileList: String;
begin
BolCopyFailed := False;
If (DirExists(Folder)) then begin
FileList := '|a.file|b.dll|...|'
if (FindFirst(Folder+'\*', FindRec)) then begin
try
repeat
if (Pos('|'+LowerCase(FindRec.Name)+'|', FileList) <> 0) then begin//this is a file known to be installed later
DeleteFile(Folder+'\'+FindRec.Name);
end Else if ((Pos('unins0', FindRec.Name) = 1) And ((Pos('.exe', FindRec.Name) = 9) OR (Pos('.dat', FindRec.Name) = 9))) Then begin
{Deleting the uninstall files seems to remove the actual installer itself...}
//DeleteFile(Folder+'\'+FindRec.Name);
End Else If ((FindRec.Name = '.') OR (FindRec.Name = '..') OR (LowerCase(FindRec.Name) = 'backup')) Then Begin
// do nothing with main directories or backup folder
end Else begin
//... some copy and paste backup of possible user-files not involved in the problem
end;
until not FindNext(FindRec);
finally
FindClose(FindRec);
end;
end;
end;
end;
如果我用它来清除旧安装,安装有时只包含 15 个应该安装的文件中的 8 个(在 [Files]
中定义,我可以看到它们被添加在编译器输出中并且通常已安装)。所以我唯一的猜测是为什么我得到的文件少于 15 个是在安装过程中删除了预安装期间应该删除的文件。因此,如果我没记错的话,所需的清理工作必须删除安装文件。但我找不到原因。
我认为安装本身会将内容放在准备部分之后的目标文件夹中。那么我错了吗/我该如何修改代码以使安装有效?我知道我可以通过在安装程序结束之前进行检查来对此进行测试,但我想这不是一个很好的做法......
我要卸载的以前的安装是这样的:
[Files]
Source: "Input\*"; DestDir: "{app}"; \
Flags: ignoreversion recursesubdirs createallsubdirs
[UninstallDelete]
Type: dirifempty; Name: "{app}" Type: dirifempty; Name: "C:\Program Files\A"
[UninstallRun]
Filename: "{sys}\taskkill.exe"; Parameters: "/F /IM a.exe"; Flags:runhidden ; \
StatusMsg: "Closing process"
最佳答案
主卸载程序进程仅在临时文件夹中创建其自身的副本,并运行子进程以进行实际卸载。
Note that at the moment you get an exit code back from the uninstaller, some code related to uninstallation might still be running. Because Windows doesn't allow programs to delete their own EXEs, the uninstaller creates and spawns a copy of itself in the TEMP directory. This "clone" performs the actual uninstallation, and at the end, terminates the original uninstaller EXE (at which point you get an exit code back), deletes it, then displays the "uninstall complete" message box (if it hasn't been suppressed with /SILENT or /VERYSILENT).
所以尽管 ewWaitUntilTerminated
,您代码中的 Exec
实际上并不等待卸载完成。所以可能会出现卸载程序和安装程序同时运行的情况。这自然会导致安装损坏。
您必须等待子卸载程序完成才能解决您的问题。快速而肮脏的解决方案是查找名称包含 _iu
的任何进程。参见 Inno Setup Pascal Script to search for running process .
关于inno-setup - 在安装开始时卸载以前版本的产品会导致 Inno Setup 中的安装损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68113854/
我听说最好不要从您系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
我听说最好不要从系统的 Perl 版本所在的 CPAN 安装模块。我知道如何使用命令行安装模块,我只是想知道是否有办法将 CPAN 与系统的核心 Perl 分开。 我应该: 下载源代码并专门为这些模块
单独安装 electron 与通过 electron-builder 安装有什么区别?我正在使用 React 构建一个 Electron 应用程序,并且已经找到了一些教程。它们安装 Electron
两者安装有什么区别?我按照安装页面上的说明在全局范围内安装了 webpack,然后我转到了入门指南,据说在那里可以在本地安装 webpack-cli。 CLI = Command Line Inter
我在 OS X Yosemite 上用 PHP 安装了默认的 Apache 服务器,安装了 pear,用 brew 安装了 Solr (brew install solr),现在我正在尝试使用 PEC
我解压并编译了 Ruby 2.1 并安装了几个支持工具。 但是当我安装了 libssl-dev 时,OpenSSL 不会安装。 我在支持 openssl 时遇到这个错误: make: *** No r
我在 android studio 2.3.1 和 gradle 3.2 中设计了 2 到 3 个应用程序。当我从它运行应用程序到任何设备或模拟器时,一切都工作正常。但是当我从构建文件夹中获取该 ap
我注意到我正在读一本书提到通过 apt-get 安装 numpy 和 opencv apt-get install python-numpy python-opencv 但我可以通过以下方式在 pip
我正在尝试在 Windows 8.1 上安装 ansicon。我提取了文件并达到了我需要调用 ansicon -i 的级别。当我在 cmd 中输入此内容并运行 python 脚本时效果很好,但是当我通
我有 linux MINT 17.3 Kernel 4.4.0-81 所有更新可用。 (由于不同的原因,我无法迁移到更新版本的 ubuntu/mint) 我已经通过 PPA 安装了 FFMPEG(不是
尝试在本地运行我的应用程序时出现错误: 我只在 chrome 浏览器中收到此错误。我尝试过不同的东西,但我不确定为什么它是 Chrome 特定的。 最佳答案 我怀疑这不是 Firebase 问题,而是
这是我第一次开发 AngularJS 应用程序并使用脚手架工具 Yeoman ( http://yeoman.io/ )。我想对我的一些图标使用 fontawesome ( http://fortaw
我知道您通常“应该”$ pip install 如果包没有 brew ,但如果有一个你想安装的 python 包,你可以使用 $ pip install或 $ brew install为了?例如,通过
我正在尝试通过 RVM 安装 Ruby 1.9.3。然而,当谈到安装 RubyGems 时,我得到了这个: curl: (22) The requested URL returned error: 4
我是真正提出问题的新手,但你去吧。 我一直在尝试按照安装指南添加 dnsname: https://github.com/containers/dnsname https://github.com/c
Studio更新至0.4.0 建筑产量为“需要1.8版Gradle”;将设置设置为1.8 bin目录; 建立 “要求1.9级”;将设置设置为1.9 bin; 建立 “要求1.8级” 啊。不知道该怎么做
我刚刚注意到 kernel.org 因维护而停机。是否有使用不同镜子的不同公式?或者我可以向 Homebrew 软件添加不同的来源(如 bundler ?)? 谢谢你的帮助! 最佳答案 快速解决方法:
当我运行时: peardev install phpunit/PHPUnit 我得到以下信息: No releases available for package "pear.phpunit.de/P
服务器操作系统为Fedora 24. 64bit。 我想安装 Git 2.6.6。 所以下载源码并安装。 此服务器离线。所以我不使用“yum”。 ./configure --prefix=/usr/l
我正在尝试在我自己的服务器(操作系统:Linux Ubuntu Server 12.04)上安装 OpenEdX,但我遇到了同样的错误。谁能帮帮我? TASK: [ insights | insta
我是一名优秀的程序员,十分优秀!