最新消息:走过的,离开的,已经错过,新开始2016

NSIS 安装结束进程

技术随笔 果果 8浏览 0评论


很多Windows安装包都是nsis打包的,我们一直在使用远古的nsis v2.46。
最近有人反馈如果进程还在运行,进行覆盖安装会报文件被占用,安装失败。
查看nsi脚本,里面是有检查进程是否运行的,但是好像不起作用。

FindProcDLL::FindProc "abcd.exe" #查找进程
KillProcDLL::KillProc "abcd.exe" #杀进程

发现这两个不知道什么原因都不启作用,不知道从什么时候开始不管用的,也不知道是Windows更新什么策略导致的。
下面我们使用nsExec直接调用Windows命令,进行处理。

;kill杀进程
Function KillProcess
  ; 1. 先尝试寻找进程,使用 nsExec 获取退出码
  ; tasklist 列出进程,通过 find 过滤,如果找到退出码为0,没找到退出码为1
  nsExec::ExecToLog 'cmd.exe /c tasklist | find "abcd.exe"'
  Pop $R0 ; 获取退出码

  ; 2. 判断退出码。如果 $R0 不为 0,说明此时进程没有在运行,直接结束本函数
  ${If} $R0 != 0
  ${AndIf} "$R0" != ""  ; 防止 nsExec 执行失败返回空字符串
    Goto Done
  ${EndIf}

  ; 3. 如果进程在运行,尝试强行关闭
  DetailPrint "检测到 abcd.exe 正在运行,正在尝试关闭..."
  nsExec::ExecToLog 'cmd.exe /c taskkill /f /im abcd.exe'
  Pop $R0 ; 获取 taskkill 的退出码

  ; 稍微等待一下让系统释放进程 (等待 1 秒)
  Sleep 1000

  ; 4. 再次检查进程是否还在运行
  nsExec::ExecToLog 'cmd.exe /c tasklist | find "abcd.exe"'
  Pop $R0

  ; 如果关闭后仍然能找到进程 (退出码为 0),说明关闭失败
  ${If} $R0 == 0
    MessageBox MB_ICONSTOP|MB_OK "程序正在运行,安装程序已尝试关闭但未成功,请手动退出 abcd.exe 后重新运行安装程序!"
    ; Abort  ; 如果希望失败时终止安装程序,解除这里的注释
  ${EndIf}

  Done:
FunctionEnd

转载请注明:果果.IT » NSIS 安装结束进程

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址