上下文
我们使用NSIS 3.05和Unicode true
(这在以后很重要)。
我们需要检查某个进程是否正在运行,让我们称之为"processToFind.exe“。
为了做到这一点,我们一直在使用nsProcess
插件,它的设置是正确的,找到并集成得很好。
我们包括git存储库中的插件,如下所示:
!addincludedir "C:\pathToRepo\NSIS\Include"
!addplugindir "C:\pathToRepo\NSIS\Plugins"
当然,pathToRepo
是一个有效的路径。我们还尝试使用默认插件目录(NSIS-Dir\Plugins\x86-unicode
),但没有效果(见下文)。
文档显示,nsProcess (v1.6)支持unicode。这就是为什么我们选择使用它。
NSIS支持(只需将nsProcessW.dll重命名为nsProcess.dll)
在设置Unicode false
或退出设置(因此默认为ansi)时,它也运行良好。(=找到正在运行的进程,而不是未找到正在运行的进程)
安装程序是32位,我们运行在64位Windows 10机器上。
代码
${nsProcess::FindProcess} "procexp.exe" $R0
MessageBox MB_OK "procexp: [$R0]"
它是在nsProcess.nsh
中定义的(由插件而不是自己的代码提供)
!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess`
!macro nsProcess::FindProcess _FILE _ERR
nsProcess::_FindProcess /NOUNLOAD `${_FILE}`
Pop ${_ERR}
!macroend
问题
设置Unicode true
时,nsProcess将始终返回603 (“进程当前未运行”)。
这是一样的,不管我们是否试图找到32位或64位进程。
这将是对64位进程的预期(它们无法从32位安装程序中找到,这对我们来说是正常的)。
但我确实希望它能找到32位的进程。
已探讨的替代办法:
查一下在检查应用程序是否正在运行。找到的名单..。
nsExec::ExecToStack '"%SystemRoot%\System32\tasklist" /NH /FI "IMAGENAME eq ${processName}" | "%SystemRoot%\System32\find" /I "${processName}"'
总是返回“错误”。(*现在很清楚为什么,请参阅下面的编辑)似乎相关的堆栈溢出问题探讨了:
Unicode=true
,这是我做不到的。我相信,我们正在犯一些“愚蠢”的错误,因为我无法相信只有我们有这种要求。因此,欢迎没有列出的任何提示、建议和替代方案(或对上述内容的更正)。
编辑
我们完全搞砸了任务清单上的电话。正如@Anders在评论中指出的: nsExec不支持管道,而且最重要的是语法也搞砸了。
发布于 2020-01-15 05:47:01
官方的例子对你有用吗?它在我的机器上工作。
试试这个:
0)删除所有nsProcess.dll文件(在NSIS中,在包含文件夹中,在任何地方)
1)从脚本中删除行!addplugindir "C:\pathToRepo\NSIS\Plugins"
,以便在NSIS目录中使用插件
2)将文件nsProcessW.dll复制到**c:\Program (x86)\NSIS\Plugins\x86-unicode**
3)重命名文件c:\Program (x86)\NSIS\Plugins\x86-unicode\nsProcessW.dll -> nsProcess.dll
4)用Unicode真编译脚本
我相信有一些文件不匹配。要了解NSIS插件结构,请参阅NSIS -检查是否存在进程(nsProcess不工作)。
发布于 2020-01-14 20:19:44
我仍然在使用ANSI,因为我使用的是其他没有Unicode变体的插件,所以nsProcess适合我,我不知道如何回答您的主要问题。
但是,re: tasklist命令,您列出的选项,语法不太正确。在到processName的管道中,您在"IMAGENAME eq ${processName}“之后缺少一个结束引号,而在"${processName}”之前缺少一个开头引号。
FYI还注意到,如果您使用%SystemRoot%\System32 32\,32位进程将被重定向到C:\Windows\SysWOW64 64\,而且有些程序没有32位等效(例如pnputil)。在这种情况下,这并不重要,但无论如何,要解决这个问题,您应该使用$WINDIR\SysNative。您也可以使用x64.nsh中的${DisableX64FSRedirection},但显然存在一些潜在的缺陷。
编辑:啊,是的,Anders在对原始问题的评论中提到了pipe和ExecToStack的问题,要求调用以cmd.exe /C作为前缀
https://stackoverflow.com/questions/59734294
复制相似问题