NSIS 检查 Windows 服务的状态
我正在编写 NSIS 脚本,我需要检查服务状态(正在运行/已停止/已暂停/不存在)并执行一些操作。 但我无法使用任何用户库,例如 nsSCM。
我发现了一个脚本
sc QUERY ServiceNameHere | FIND "RUNNING"
但我找不到如何检查 NSIS 脚本中的返回结果。
请帮忙。
I am writing NSIS script and i need to check service state (Running/Stopped/Paused/No exist) and to make some actions then.
But i can`t use any user libs such as nsSCM.
I found a script
sc QUERY ServiceNameHere | FIND "RUNNING"
but i can`t find how to check the return result in NSIS script.
Please help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您可以使用插件:
使用简单服务插件,您可以执行此操作:
如果成功,服务状态将具有以下数值之一:
如果您无法使用插件:
请注意,我在 FIND 中添加了 /C。 exe 输出行数而不是整行。另外,修改引号时要小心。经过一些尝试和错误才得到正确的结果。
请务必包含逻辑库,因为 NSIS 需要此库用于条件语句宏:
If you can use plug-ins:
Using the Simple Service Plugin, you can do this:
If successful, the service status will have one of the following numeric values:
If you can NOT use plug-ins:
Note that I added /C to FIND.exe to output the line count instead of the entire line. Also, be careful modifying the quotes. It took some trial and error to get that right.
Be sure to include the logic library, as NSIS requires this for conditional statement macros:
有几个处理 NT 服务的 NSIS 插件和辅助函数:NSIS 服务库、NSIS 简单服务插件 和 NsSCM。 Wiki 概述了所有选项。
使用 sc.exe 是有问题的,因为输出可能是本地化的,net.exe 可能更好(并且它也在
There are several NSIS plugins and helper functions that deal with NT services: NSIS Service Lib, NSIS Simple Service Plugin and NsSCM. The wiki has a overview of all your options.
Using sc.exe is problematic since the output might be localized, net.exe is probably better (And it also exits on < WinXP) here is my take on that solution:
我使用其 DISPLAY 名称(而不是服务名称)检查服务是否正在运行,因为它往往更精确(例如,服务名称是 JETTY,而 DISPLAY 名称使用我的产品名称 - 我避免了计算 JETTY 服务的风险由另一个产品安装)。
因此,根据凯尔的解决方案,我使用:
I check if a service is running by using its DISPLAY name (not the service name), because it tends to be more precise (e.g. service name is JETTY while the DISPLAY name uses my product name - I avoid the risk of counting a JETTY service installed by another product).
So based on Kyle's solution I use: