0

我收到了一个安装项目(.VDProject / Deployment 项目),它需要一个 dll 并提取到某个位置。
我的目标是在将文件复制到正确的位置后,在安装/卸载结束时重新启动某个 Windows 服务。

这样做的正确方法是什么?通过 VBS 在“自定义操作”的“提交”和“卸载”部分?

此脚本不起作用:

Set oshell = createobject("Wscript.Shell")
oshell.run"cmd.exe"
wscript.sleep 500
oshell.sendkeys "net stop ""MyService"""+("{Enter}")
wscript.sleep 5000
oshell.sendkeys "net start ""MyService"""+("{Enter}")
wscript.sleep 5000
oshell.sendkeys "exit"+("{Enter}")

set oshell = nothing

WScript.Quit
4

1 回答 1

1

您与 VDPROJ 的婚姻如何?它在 VS2012 中被微软杀死,因为坦率地说它很糟糕。

停止和启动服务的正确方法是使用 ServiceControl 表。可悲的是,VDPROJ 没有公开这张表(让我数一数它的糟糕之处)。

VBScript/JScript 自定义动作是出了名的脆弱。他们也脱离了流程并重新发明了轮子(ServiceControl)。

如果为安装或策略禁用回滚,则不会运行提交自定义操作。

延迟自定义操作是您需要的地方,但是是的,您猜对了,VDPROJ 没有给您那种控制。

一种技术是创建一个 WiX 合并模块来封装 ServiceControl 元素并将其合并到您的 VDPROJ 中。这是我在博客中介绍的一种技术。在示例中,您将使用 ServiceControl 元素而不是 ServiceInstall 元素。

也可以使用 ORCA 创建一个包含您的 ServiceControl 表的静态转换,并将其作为构建后事件的一部分应用于 VDPROJ 构建的 MSI。

无论如何,就像我说的……你和 VDPROJ 的婚姻如何?这些都是绕过该工具可怕性的技巧。改为完全使用 WiX 可能更有意义。

于 2013-02-06T18:52:26.403 回答