在 Inno Setup 中使用“taskkill /f /im”在(重新)安装之前终止进程

Posted

技术标签:

【中文标题】在 Inno Setup 中使用“taskkill /f /im”在(重新)安装之前终止进程【英文标题】:Kill process before (re)install using "taskkill /f /im" in Inno Setup 【发布时间】:2016-02-19 23:21:13 【问题描述】:

我安装了一个服务/守护进程,需要在卸载和重新安装之前将其杀死。

我已经发现how to do it for uninstall:

[UninstallRun]
Filename: "taskkill"; Parameters: "/im ""My Service.exe"" /f"; Flags: runhidden

但是,[Run] 部分在安装后运行,因此我不能使用它。在安装之前使用taskkill 终止进程的最佳方法是什么?

请注意,我特别想终止该进程。 A more complex solution using IPC 在我的情况下没有任何好处,我只想在安装特定文件之前执行 taskkill

【问题讨论】:

【参考方案1】:

我在代码部分找到了一种使用BeforeInstall 参数和一个简单的Pascal 脚本函数的方法。我添加了一个字符串参数,以便它可以被多个进程重用。

[Files]
Source: "My Service 1.exe"; DestDir: "app"; Flags: ignoreversion; \
    BeforeInstall: TaskKill('My Service 1.exe')
Source: "My Service 2.exe"; DestDir: "app"; Flags: ignoreversion; \
    BeforeInstall: TaskKill('My Service 2.exe')
[Code]
procedure TaskKill(FileName: String);
var
  ResultCode: Integer;
begin
    Exec('taskkill.exe', '/f /im ' + '"' + FileName + '"', '', SW_HIDE,
     ewWaitUntilTerminated, ResultCode);
end;

【讨论】:

如果环境路径找不到taskkill.exe,您可以设置它的绝对路径:Exec(ExpandConstant('sys\taskkill.exe'), '/f /im ' + '"' + FileName + '"', ExpandConstant('sys'), SW_HIDE, ewWaitUntilTerminated, ResultCode); 并不总是有效,我的一个客户中的 taskkill 有时会响应“内存不足”错误【参考方案2】:

除非安装程序在 Windows XP 机器上运行,或者您已将 CloseApplications directive 设置为 no(默认为 yes),否则安装程序应自动关闭应用程序:

从Inno Setup 5.5 开始,该功能在 Windows Vista 及更高版本上可用。


虽然有时候yes不够用,你需要使用force:Installer created via Inno Setup, can't close applications during installation on Windows 10

【讨论】:

以上是关于在 Inno Setup 中使用“taskkill /f /im”在(重新)安装之前终止进程的主要内容,如果未能解决你的问题,请参考以下文章

inno setup安装包制作问题?

inno setup 打包使用超级管理员权限

如何使用 inno setup 结束进程?

Inno Setup 如何读写文件

计划任务在 Inno Setup 中隐藏运行

请问在Inno Setup打包中ActiveLanguage()函数怎么使用?