2008-10-06 86 views

回答

1

我实际上并没有在生产环境中实际使用过它,我不确定您拥有哪个版本(我拥有版本2.1.3155.0的副本),并根据随附的.chm帮助文件,任务具有以下内容属性:

  • 如果指定的服务存在
  • 如果服务被禁用
  • 服务名称标识服务于该系统中的短名称IsDisabled返回TRUE DoesExist返回TRUE。

ServiceName需要设置为“识别系统服务的短名称,例如'W3SVC'”。

您可能想尝试使用众所周知的服务(例如mssqlserver)并检查其他两个属性(DoesExist/IsDisabled)的结果。

更新:下面是一个示例(作品):

导入任务,然后调用(如)

< Microsoft.Sdc.Tasks.ServiceProcess.Exists 服务名称= “服务器”> <输出TaskParameter = “DoesExist” 属性名= “存在”/> < /Microsoft.Sdc.Tasks.ServiceProcess.Exists>

<消息文本= “服务存在?$(存在)”/>

2

这就是我们如何检查服务是否存在,如果是,停止它,做一些事情,并再次启动服务(如果有一个,它已经启动)。

助手目标:

<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行:|