我正在使用我的服务的pre和post构建事件来卸载和安装服务。唯一的问题是,第一次另一个开发人员使用预构建事件时它失败了,因为尚未安装该服务。
我卸载的当前预构建事件是
%WinDir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil /u $(TargetPath)
如何在已安装服务的情况下将此功能用于仅卸载?
答案 0 :(得分:14)
您可以使用Microsoft SC工具(Sc.exe)查询服务的状态,甚至可以创建或删除服务。这是一篇关于使用此命令的文章:http://support.microsoft.com/kb/251192
从命令提示符窗口(为强调而编辑的内容):
C:\windows\system32>sc
DESCRIPTION:
SC is a command line program used for communicating with the
Service Control Manager and services.
USAGE:
sc <server> [command] [service name] <option1> <option2>...
The option <server> has the form "\\ServerName"
Further help on commands can be obtained by typing: "sc [command]"
Commands:
query-----------Queries the status for a service, or
enumerates the status for types of services.
queryex---------Queries the extended status for a service, or
enumerates the status for types of services.
start-----------Starts a service.
pause-----------Sends a PAUSE control request to a service.
continue--------Sends a CONTINUE control request to a service.
stop------------Sends a STOP request to a service.
delete----------Deletes a service (from the registry).
create----------Creates a service. (adds it to the registry).
运行此命令以查询(A)存在且(B)不存在的服务导致:
(A)
C:\Windows\System32>sc query W32Time
SERVICE_NAME: W32Time
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
(B)
C:\Windows\System32>sc query nothere
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:
The specified service does not exist as an installed service.
因此,您可以在尝试使用以下内容删除它之前测试服务的存在 - (原谅令人厌恶地使用FOR语句,我不确定如何将sc命令的输出捕获到变量或在IF语句中使用它 -
set svcname=W32Time
set svc=exists
for /f "delims=" %%o in ('sc query %svcname% ^| find "FAIL"') do set svc=notexists
if "%svc%"=="exists" sc delete %svcname%
答案 1 :(得分:0)
我正在使用Visual Studio 2008来构建服务,并且像我一样,我希望它在我重建它时为我重新安装服务。
我的预建是
net stop P2PSN.Bridge.Service
$(FrameworkDir)\installutil.exe /u $(TargetPath)
Exit /b 0
我的帖子构建
$(FrameworkDir)\installutil.exe /ShowCallStack $(TargetPath)
net start P2PSN.Bridge.Service
“退出/ b 0”表示即使未安装该服务,也不会失败。同样,如果您还没有构建服务,它仍然可以工作。这些命令第一次显然会成功。
为了让这个工作,您必须运行具有高效许可的视觉工作室。
希望这有帮助。
答案 2 :(得分:0)
以Jim Grimmett的解决方案为基础并将其与.net 4.0结合使用,预构建成为:
net stop yourServiceName
%WinDir%\ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil / u“$(TargetPath)”
退出/ b 0
和后期制作:
%WinDir%\ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil / i“$(TargetPath)”
net start yourServiceName
rem退出/ b 0
可悲的是,$(FrameworkDir)没有扩展到.net 4.0路径