在 Inno Setup 中使用 "taskkill /f /im" 安装(重新)之前终止进程
Kill process before (re)install using "taskkill /f /im" in Inno Setup
我安装了一个service/daemon,卸载重装前需要杀掉
我已经知道了 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
。
我在代码部分找到了使用 BeforeInstall
参数和一个简单的 Pascal Script 函数的方法。我添加了一个字符串参数,因此它可以被多个进程重复使用。
[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;
除非安装程序是 运行 在 Windows XP 机器上,或者您已将 CloseApplications
directive 设置为 no
(默认为 yes
),安装程序应自动关闭应用程序:
此功能自 Inno Setup 5.5 起在 Windows Vista 和更新版本上可用。
虽然有时候yes
不够用,你需要用force
:
我安装了一个service/daemon,卸载重装前需要杀掉
我已经知道了 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
。
我在代码部分找到了使用 BeforeInstall
参数和一个简单的 Pascal Script 函数的方法。我添加了一个字符串参数,因此它可以被多个进程重复使用。
[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;
除非安装程序是 运行 在 Windows XP 机器上,或者您已将 CloseApplications
directive 设置为 no
(默认为 yes
),安装程序应自动关闭应用程序:
此功能自 Inno Setup 5.5 起在 Windows Vista 和更新版本上可用。
虽然有时候yes
不够用,你需要用force
: