1

有一个 Windows 服务,需要通过项目构建重新创建它。

在活动前:

sc 查询“服务”| findstr /i 运行 | if "%errorlevel%"=="0" (sc stop "Service")

sc 查询“服务”| findstr /i 运行 | if "%errorlevel%"=="0" (sc delete "Service")

在后期活动中:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe $(TargetPath)

网络启动“服务”

但我有类似的问题

错误 1 ​​命令“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe D:...\bin\Debug\Host.exe

net start "Service" " 以代码 2 退出。主机

有什么帮助吗?

4

3 回答 3

4

我面临着同样的问题。在我的情况下,sc stop "Service"当服务已经处于停止状态时,当您尝试使用命令停止 Windows 服务时,就会发生这种情况。

如果在执行命令时出现错误,那么命令 shell 返回非零值(主要是 1 或整数错误代码)作为返回代码,Visual Studio 根据该代码停止进一步的构建过程。

由于服务已经处于停止状态,所以我们想要的是 Visual Studio 应该简单地忽略返回码。您可以通过下面提到的任何一种方式实现它。只需将其附加到预构建事件代码的末尾即可:

SET ERRORLEVEL = 0

或者

EXIT 0

即使在服务已经处于停止状态时出现任何错误,这也会强制返回 0(成功)代码。所以我完整的 Pre-build 事件代码如下所示:

IF "Debug" == "$(ConfigurationName)" ( 
   sc query "W3SVC" | findstr "RUNNING" &  if %errorlevel% == 0 (net stop "World Wide Web Publishing Service")
   EXIT 0

我的意图是停止 IIS 服务仅用于调试构建。

于 2017-11-28T05:07:39.690 回答
0

不要忘记 Build 事件中的脚本实际上只不过是 shell 脚本,所以如果你不使用 [双] 引号括起来,路径(或程序集等)中的空格会搞砸。

我所做的是在 shell 中使用宏 ${TargetPath} 等,输入命令完全按照它们将被扩展的方式,首先确保它是正确的。在那里你会看到空间问题是否让你着迷。

我同意 VS 界面并没有给出很多具体的反馈,但公平地说,它实际上只是分叉到一个 shell,并显示 shell完成所有行后返回的内容。

因此,在一行上的错误级别(VS 的“退出代码”)被抛出以作为最后的摘要错误级别。

这是我放在项目根目录中的 2 个批处理文件,“如果较新则复制”到输出目录,并在命令行上运行:

.\startDeploy.bat

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe SomeService.exe
net start "Some Server"

...和...

.\stopDeploy.bat

net stop "Some Server"
    C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /LogToConsole=true /u SomeService.exe

如果你有更好的方法(我喜欢你使用 sc),那么只需冲洗、起泡、重复。当您确定一切正常时,然后转换为构建事件窗口。在我准备好部署之前,我不会这样做。

于 2014-01-12T15:06:14.153 回答
0

这对我有用...

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe" /u $(TargetFileName)
"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe" $(TargetFileName)
 net start "Replace With Service Name"

我将这些命令放在 Build Events 的 Post-Build 部分。

第一行将卸载您的服务的预先存在的实例。如果服务不存在,这不会失败,因此无需先查询服务。您也不需要停止服务,卸载会自动完成。

第二行将安装/重新安装您的服务。

第三行将启动服务。确保将其更改为不带任何文件扩展名的服务名称。

希望这可以帮助。

于 2016-02-23T22:09:29.537 回答