Вот так мы проверяем, существует ли служба, останавливаем ее, если что-то делаем, делаем что-то и снова запускаем службу (если она была и была запущена).
Цель помощника:
<target name="service_exists">
<script language="C#">
<references>
<include name="System.ServiceProcess.dll" />
</references>
<code><![CDATA[
public static void ScriptMain(Project project) {
String serviceName = project.Properties["service.name"];
project.Properties["service.exists"] = "false";
project.Properties["service.running"] = "false";
System.ServiceProcess.ServiceController[] scServices;
scServices = System.ServiceProcess.ServiceController.GetServices();
foreach (System.ServiceProcess.ServiceController scTemp in scServices)
{
if (String.Compare(scTemp.ServiceName.ToUpper(), serviceName.ToUpper()) == 0)
{
project.Properties["service.exists"] = "true";
project.Log(Level.Info, "Service " + serviceName + " exists");
if (scTemp.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Running))
project.Properties["service.running"] = "true";
project.Log(Level.Info, "Service " + serviceName + " is running: " + project.Properties["service.running"]);
return;
}
}
project.Log(Level.Info, "Service " + serviceName + " doesn't exist");
}
]]></code>
</script>
</target>
Использование:
<property name="service.name" value="Selection.Service" />
<call target="service_exists" />
<servicecontroller action="Stop" service="${service.name}" machine="${host}" timeout="60000" if="${service.exists}"/>
<!-- Do something -->
<servicecontroller action="Start" service="${service.name}" machine="${host}" timeout="60000" if="${bool::parse(service.exists) and bool::parse(service.running) == true}"/>
Надеюсь, я ничего не пропустил - наш администратор сборки хранит все в одном файле msbuild, который теперь содержит более 3600 строк: |