Visual studio windows服务的生成前/生成后事件。最佳做法
已获取windows服务,需要使用project build重新创建该服务 在活动前: sc查询“服务”|查找正在运行的DSTR/i |如果“%errorlevel%”=0(sc 停止“服务”) sc查询“服务”|查找正在运行的DSTR/i |如果“%errorlevel%”=0(sc 删除“服务”) 事件后: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe $(目标路径) 净启动“服务” 但我有这样的问题 命令错误1 “C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe D:…\bin\Debug\Host.exe 网络启动“服务”已退出,代码为2。主人Visual studio windows服务的生成前/生成后事件。最佳做法,visual-studio,windows-services,pre-build-event,prebuild,build-events,Visual Studio,Windows Services,Pre Build Event,Prebuild,Build Events,已获取windows服务,需要使用project build重新创建该服务 在活动前: sc查询“服务”|查找正在运行的DSTR/i |如果“%errorlevel%”=0(sc 停止“服务”) sc查询“服务”|查找正在运行的DSTR/i |如果“%errorlevel%”=0(sc 删除“服务”) 事件后: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe $(目标路径) 净启动“服务” 但我有这样的问题 命令错误
有什么帮助吗?请不要忘记,构建事件中的脚本实际上只不过是shell脚本,因此如果不使用[双]引号,路径(或程序集等)中的空格将使其出错 我要做的是在shell中使用宏${TargetPath}等,输入与展开命令完全相同的命令,首先确保它是正确的。在那里,你将看到空间问题是否让你陷入困境 我同意VS接口没有给出很多具体的反馈,但公平地说,它实际上只是分岔到一个shell,并显示shell在处理完所有行后返回的内容 因此,在一行上抛出一个errorlevel('exit code'到VS),最后抛出一个摘要错误级别a 下面是我放在项目根目录中的两个批处理文件,“如果更新,请复制”到输出目录,并在命令行上运行:
.\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),那么只需冲洗,起泡,重复。当您确定一切正常时,请将其转换为“生成事件”窗口。在准备部署之前,我不会这样做。不要忘记,构建事件中的脚本实际上只不过是shell脚本,因此如果不使用双引号括起来,路径(或程序集等)中的空格将把事情搞砸 我要做的是在shell中使用宏${TargetPath}等,输入与展开命令完全相同的命令,首先确保它是正确的。在那里,你将看到空间问题是否让你陷入困境 我同意VS接口没有给出很多具体的反馈,但公平地说,它实际上只是分岔到一个shell,并显示shell在处理完所有行后返回的内容 因此,在一行上抛出一个errorlevel('exit code'到VS),最后抛出一个摘要错误级别a 下面是我放在项目根目录中的两个批处理文件,“如果更新,请复制”到输出目录,并在命令行上运行:
.\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),那么只需冲洗,起泡,重复。当您确定一切正常时,请将其转换为“生成事件”窗口。在准备部署之前,我不会执行此操作。这对我很有用
"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"
我将这些命令放在生成事件的生成后部分
第一行将卸载服务的一个预先存在的实例。如果服务不存在,则不会失败,因此无需首先查询服务。您也不需要停止服务,卸载将自动完成
第二行将安装/重新安装您的服务
第三条线路将启动服务。
确保将其更改为不带任何文件扩展名的服务名称
希望这对我有帮助。这对我有用
"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"
我将这些命令放在生成事件的生成后部分
第一行将卸载服务的一个预先存在的实例。如果服务不存在,则不会失败,因此无需首先查询服务。您也不需要停止服务,卸载将自动完成
第二行将安装/重新安装您的服务
第三条线路将启动服务。
确保将其更改为不带任何文件扩展名的服务名称
希望这能有所帮助。我也面临着同样的问题。在我的例子中,当服务已经处于停止状态时,您尝试使用
sc stop“service”
命令停止windows服务时,就会发生这种情况
如果在执行命令时出错,那么命令shell将返回非零值(主要是1或整数错误代码),作为返回代码,Visual Studio将根据该返回代码停止进一步的生成过程
因为服务已经处于停止状态,所以我们希望VisualStudio忽略返回代码。您可以通过下面提到的任何一种方式实现它。只需将其附加到预构建事件代码的末尾:
SET ERRORLEVEL = 0
或
即使在服务已处于停止状态时出现任何错误,也会强制返回0(成功)代码。因此,我的完整预构建事件代码如下所示:
IF "Debug" == "$(ConfigurationName)" (
sc query "W3SVC" | findstr "RUNNING" & if %errorlevel% == 0 (net stop "World Wide Web Publishing Service")
EXIT 0
我的意图是仅在调试构建时停止IIS服务。我也面临着同样的问题。在我的例子中,当服务已经处于停止状态时,您尝试使用
sc stop“service”
命令停止windows服务时,就会发生这种情况
如果在执行命令时出错,那么命令shell将返回非零值(主要是1或整数错误代码),作为返回代码,Visual Studio将根据该返回代码停止进一步的生成过程
因为服务已经处于停止状态,所以我们希望VisualStudio忽略返回代码。您可以通过下面提到的任何一种方式实现它。只需将其附加到预构建事件代码的末尾:
SET ERRORLEVEL = 0
或
即使在服务已处于停止状态时出现任何错误,也会强制返回0(成功)代码。因此,我的完整预构建事件代码如下所示:
IF "Debug" == "$(ConfigurationName)" (
sc query "W3SVC" | findstr "RUNNING" & if %errorlevel% == 0 (net stop "World Wide Web Publishing Service")
EXIT 0
我的意图是仅在调试构建时停止IIS服务。在这种情况下,将errorlevel设置为0是一种给我的灵魂带来纯粹快乐的解决方案。很好的解决方案!将errorlevel设置为0