NSIS通过路径杀死指定进程解决方法

news2024/10/17 11:32:48

当软件安装时,如果有特定的软件正在运行,则新软件无法对其进行覆盖。同样当软件卸载时,如果其正在运行,则有残留的文件删不干净。所以便出现了在安装卸载中杀死指定进程的需求。

文章目录

  • 一、踩坑记录
    • 1. FindProcDLL和KillProcDLL失效
    • 2. NSIS转义符
    • 3. NSIS中调用PowerShell的Get-Process无法找到所有进程
  • 二、正确实现
    • 1. 法一:调用外部PowerShell命令文件
    • 2. 法二:使用 WMIC 命令根据路径查找进程并终止


一、踩坑记录

1. FindProcDLL和KillProcDLL失效

首先说明!!!网上的大部分例子都是使用NSIS官方下载的插件:FindProcDLL和KillProcDLL,但是基本上都是2012年左右发布的解决办法,在新版的NSIS已经失效了!!!目前使用的NSIS基本都是v3.0以后的版本,但是该插件在v2.46版本之后就不工作了。
在这里插入图片描述
在这里插入图片描述
我在没有看到这条消息之前,还在官方下载了FindProcDLL和KillProcDLL插件并放入NSIS插件列表,最终测试并不好使,并不能找到并杀死进程。
在这里插入图片描述

2. NSIS转义符

在NSIS中定位到指定进程路径时,需要有引号,或者是在PowerShell中用$_.Path查找路径时,这个$同样也是NSIS中的特殊字符,所以均存在转义问题。下边是常见的特殊字符转义。
在这里插入图片描述

3. NSIS中调用PowerShell的Get-Process无法找到所有进程

我最初是在PowerShell中调用如下代码进行杀死进程的,在PowerShell里是可以检测到指定程序并杀死生效的。

Get-Process | Where-Object { $_.Path -eq "D:\Work\TheiaIDE_Test\Clash Test\Clash for Windows.exe" } | Stop-Process -Force

在这里插入图片描述

但是,NSIS调用powershell脚本,用同样的语句,是检测不到指定进程的!!!
在这里插入图片描述
如上图,我在ps1文件中让输出所有检测到的路径到D:\temp\ps_log.txt文件中(这个文件需要自己先手动创建,否则Powershell执行失败),但是没有我需要杀死的指定进程路径!
在这里插入图片描述
或者在NSIS中使用这条执行并判断$process,可知$process为空,会输出:Error: Process not found.

$process = Get-Process | Where-Object { $_.Path -eq "D:\Work\TheiaIDE_Test\Clash Test\Clash for Windows.exe" }
if ($process) {
    "Process found: $($process.Name)" | Out-File -FilePath "D:\temp\ps_log.txt" -Append
} else {
    "Error: Process not found." | Out-File -FilePath "D:\temp\ps_log.txt" -Append
}

原因可能是系统自带的powershell权限更高,而通过NSIS调用的powershell与运行的指定程序不在同一个权限或者层级,所以检测不到。

二、正确实现

1. 法一:调用外部PowerShell命令文件

因为NSIS中直接调用PowerShell指令存在字符转义的问题,会搞得很混乱,所以把PowerShell的多条指令放在外部ps1文件中,然后直接通过NSIS去调用执行整个ps1文件将相对简单。
具体实现如下:
在.nsh文件中使用nsExec::ExecToStack 调用 PowerShell 脚本
在这里插入图片描述

; 卸载页面组件
Section "un.Clash" un_Section_Clash
    ${GetParent} $INSTDIR $5
    StrCpy $Clash_Path "$5\Clash Test"
    StrCpy $PowerShellScript "D:\Work\theia-blueprint_origin\theia-blueprint\applications\electron\resources\customNsi\stop_clash.ps1"

    ; 使用 nsExec::ExecToStack 调用 PowerShell 脚本
    nsExec::ExecToStack 'powershell -inputformat none -ExecutionPolicy RemoteSigned -File "$PowerShellScript"'
    ; 删除目录
    RMDir /r "$Clash_Path"
SectionEnd

stop_clash.ps1文件中定义要执行的PowerShell指令。

try {
    # 列出所有进程及其路径,不生效
    # Get-Process | ForEach-Object {
    #     try {
    #         $_.Path
    #     } catch {}
    # } | Out-File -FilePath "D:\temp\ps_log.txt" -Append

	# 输出所有检测到的路径到D:\temp\ps_log.txt文件中(这个文件需要自己先手动创建,否则Powershell执行失败)
    "Log: 11111111" | Out-File -FilePath "D:\temp\ps_log.txt" -Append
	# 使用Get-WmiObject获取所有进程路径会生效
    Get-WmiObject Win32_Process | ForEach-Object {
        try {
            if ($_.ExecutablePath) {
                $_.ExecutablePath | Out-File -FilePath "D:\temp\ps_log.txt" -Append
            } else {
                "Process: $($_.Name) has no ExecutablePath" | Out-File -FilePath "D:\temp\ps_log.txt" -Append
            }
        } catch {
            "Error accessing path for Process: $($_.Name)" | Out-File -FilePath "D:\temp\ps_log.txt" -Append
        }
    }

    $process = Get-WmiObject Win32_Process | Where-Object { $_.ExecutablePath -eq "D:\Work\TheiaIDE_Test\Clash Test\Clash for Windows.exe" }
    if ($process) {
        "Process found: $($process.Name)" | Out-File -FilePath "D:\temp\ps_log.txt" -Append
        $process | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } # 杀死进程
        "Process stopped." | Out-File -FilePath "D:\temp\ps_log.txt" -Append
    } else {
        "Error: Process not found." | Out-File -FilePath "D:\temp\ps_log.txt" -Append
    }
}
catch {
    # 如果出现错误,记录错误信息
    "Error: $($_.Exception.Message)" | Out-File -FilePath "D:\temp\ps_log.txt" -Append
}

可以看到使用Get-WmiObject获取所有进程路径会生效
在这里插入图片描述
下边是Get-Process和Get-WmiObject的比较,在NSIS调用PowerShell指令中,只有Get-WmiObject是能达到预期功能的。
在这里插入图片描述

2. 法二:使用 WMIC 命令根据路径查找进程并终止

上述法一是在PowerShell脚本中使用Get-WmiObject Win32_Process,本质是PowerShell 通过 Windows Management Instrumentation (WMI) 进行系统查询。其实在NSIS中,可以不用通过PowerShell去调用WMI,可以直接使用nsExec::ExecToStack 执行 wmic 命令删除进程。具体实现如下,直接在.nsh文件中调用即可:

; 卸载页面组件
Section "un.Clash" un_Section_Clash
    ${GetParent} $INSTDIR $5
    StrCpy $Clash_Path "$5\Clash Test"
    
    ; 定义要终止的进程路径
    StrCpy $EXE_PATH "D:\\Work\\TheiaIDE_Test\\Clash Test\\Clash for Windows.exe"
    ; 使用 nsExec::ExecToStack 执行 wmic 命令删除进程,这里用到了NSIS特殊字符转义
    nsExec::ExecToStack 'wmic process where "ExecutablePath=$\'$EXE_PATH$\'" delete'
    
    ; 删除目录
    RMDir /r "$Clash_Path"
SectionEnd

然后编译运行就可以关闭进程并且删干净了!

总结:网络上检索尝试了两天,很多方法都是十几年前的都失效了,或者是只能传递特定的进程名称,无法传递路径,那么不符合我的需求。而且NSIS存在特殊字符转义,调用其它外部指令的时候会搞得很混乱。
上述两种方法在我本地都是可以实现通过路径杀死指定进程,我觉得主要麻烦的地方是获取到正在运行的进程,如果我提供的方法不好使,可以查看NSIS官方提供的文档找出灵感:Check whether your application is running

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS3 提示框带边角popover

CSS3 提示框带边角popover。因为需要绝对定位子元素&#xff08;这里就是伪元素&#xff09;&#xff0c;所以需要将其设置为相对对位 <!DOCTYPE html> <html> <head> <title>test1.html</title> <meta name"keywords" con…

STM32的独立看门狗定时器(IWDG)技术介绍

在嵌入式系统中&#xff0c;确保系统的稳定性和可靠性至关重要。看门狗定时器&#xff08;Watchdog Timer, WDT&#xff09; 是一种常用的硬件机制&#xff0c;用于监控系统的运行状态&#xff0c;防止系统因软件故障或意外情况进入不可预期的状态。STM32系列微控制器提供了两种…

解读华为云Kuasar多沙箱容器技术,带来更强隔离性和安全性

摘要&#xff1a;沙箱技术的引入&#xff0c;为容器提供了更强的隔离性和安全性&#xff0c;成为云原生技术的重要组成部分。 本文来源 《华为云DTSE》第五期开源专刊&#xff0c;作者&#xff1a;华为云云原生开源团队研发工程师。 近年来&#xff0c;云原生容器技术飞速发展&…

整理—计算机网络

目录 网络OSI模型和TCP/IP模型 应用层有哪些协议 HTTP报文有哪些部分 HTTP常用的状态码 Http 502和 504 的区别 HTTP层请求的类型有哪些&#xff1f; GET和POST的使用场景&#xff0c;有哪些区别&#xff1f; HTTP的长连接 HTTP默认的端口是什么&#xff1f; HTTP1.1怎…

YOLO11改进 | 注意力机制 | 添加SE注意力机制

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了YOLOv11添加SE注意力机制&…

双通道音频功率放大电路D2822M兼容TDA2822,全封装输出功率0.11W,用于音频产品

在某客户的便携式音频产品中&#xff0c;客户想在确保其产品的性能的前提下&#xff0c;为产品方案寻找一颗国产备份料。客户产品之前使用的是TDA2822&#xff0c;在了解客户的电路设计以及该产品的电气特性后&#xff0c;给客户寻找了一款可兼容相同电路设计使用的国产厂牌芯谷…

Nginx12-集群高可用

零、文章目录 Nginx12-集群高可用 1、Nginx实现服务器集群 &#xff08;1&#xff09;单机模式 在使用Nginx和Tomcat部署项目的时候&#xff0c;我们使用的是一台Nginx服务器和一台Tomcat服务器&#xff0c;架构图如下 &#xff08;2&#xff09;集群模式 如果Tomcat宕机了…

大语言模型实战教程首发:基于深度学习的大规模自然语言处理模型LLM详解 -Shelly

我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 大模型的热度&#xff0c;实在是很高&#xff0c;诺奖也颁给了…

C语言函数递归经典例题:汉诺塔和小青蛙跳台阶

目录 汉诺塔问题描述思路代码实现思考:怎么判断一共要移动几次?(时间复杂度?) 小青蛙跳台阶BC117 小乐乐走台阶问题描述递归动态规划迭代 汉诺塔 问题描述 将塔A的柱子移动到塔C 要求: 大的柱子只能在小的柱子下面一次只能移动一个柱子 思路 想把A上的n个柱子移动到C 核…

Python学习100天第11天之文件和异常

1 前言 实际开发中常常会遇到对数据进行持久化操作的场景&#xff0c;而实现数据持久化最直接简单的方式就是将数据保存到文件中。说到“文件”这个词&#xff0c;可能需要先科普一下关于文件系统的知识&#xff0c;但是这里我们并不浪费笔墨介绍这个概念&#xff0c;请大家自…

请求第三方接口有反斜杠和双引号怎么处理,且做格式校验?

如&#xff1a;接口文档要求 直接使用转义失败&#xff0c;在postman中填值请求正常。 String para "[" "\\" "\"" "预计今天白天我市多云间晴&#xff1b;" "\\" "\"]"; System.err.println(pa…

QT的文件操作类 QFile

QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能&#xff0c;支持文本和二进制文 件。 QFile 继承自 QIODevice &#xff0c;因此它可以像其他IO设备一样使用。 主要功能 文件读写&#xff1a; QFile 支持打开文件进行读取或写入操作文件信息&#x…

LinkedList和链表(上)

1. 顺序表ArrayList的缺点和优点 优点: 1> 在给定下标进行查找的时候,时间复杂度是O(1) 缺点: 1> 插入数据必须移动其他数据,最坏情况下,插入到0位置,时间复杂度为O(N) 2> 删除数据也需要移动数据,最坏情况下,就是删除0位置.时间复杂度为O(N) 3> 扩容之后(1.5倍扩容…

[PHP]Undefined index错误只针对数组

1、示例一 <?php $a null; var_dump($a[name]); 结果&#xff1a;无报错 2、示例二 <?php $a []; var_dump($a[name]);结果&#xff1a;报错

v853 tina 文件系统挂载不全问题

文章目录 1、前言2、环境介绍3、解决 1、前言 正常文件系统挂载后应如下图所示&#xff1a; 但目前是这样&#xff1a; 2、环境介绍 硬件&#xff1a;韦东山v853 aicit板卡 软件&#xff1a;v853 tina sdk 3、解决 menuconfig中开启e2fsprogs&#xff1a; Utilities ---&…

C++ —— 关于继承(inheritance)

目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承的定义格式 1.3 继承基类成员访问方式的变化 1.4 类模板的继承 2.基类与派生类的转换 3. 继承中的作用域 3.1 隐藏规则 4. 派⽣类的默认成员函数 4.1 4个常见默认成员函数 4.2 实现⼀个不能被继承的类 5. 继承与友元…

房产销售系统(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于房产销售系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了房产销售系统&#xff0c;它彻底改变了过去传统的…

wps安装教程

WPS office完整版是一款由金山推出的免费办公软件&#xff0c;软件小巧安装快&#xff0c;占用内存极小&#xff0c;启动速度快。WPS office完整版包含WPS文字、WPS表格、WPS演示三大功能模块&#xff0c;让我们轻松办公。WPS的功能是依据OFFICE用户的使用习惯而设计&#xff0…

ios局域网访问主机Xcode配置

前景&#xff1a; 公司业务是做智能家居&#xff0c;所有设备通过主机控制&#xff0c;目前有个产品需求是&#xff0c;在没有外网的情况下依然能够通过局域网控制主机的设备。 IOS开发需要做的&#xff1a; 除了业务代码之外&#xff0c;前提还要配置访问局域网功能。有以下…

专升本:开启人生新征程

在当今社会&#xff0c;学历的重要性日益凸显。对于专科生来说&#xff0c;专升本无疑是一次改变命运、开启人生新征程的重要机遇。 一、专升本的价值与意义 &#xff08;一&#xff09;学历提升当你通过专升本考试&#xff0c;成功踏入本科院校的大门&#xff0c;你将获得更高…