1

我正在尝试使用Microsoft.Sdc.Tasks.ServiceProcess.Exists来检查服务是否存在。但是文档中没有使用它的示例。有人有吗?

4

2 回答 2

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

于 2008-10-06T07:16:41.470 回答
1

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

  • DoesExist 如果指定的服务存在,则返回 TRUE
  • IsDisabled 如果服务被禁用,则返回 TRUE
  • ServiceName 向系统标识服务的短名称。

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

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

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

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

<Microsoft.Sdc.Tasks.ServiceProcess.Exists ServiceName="Server"> <Output TaskParameter="DoesExist" PropertyName="Exists" /> </Microsoft.Sdc.Tasks.ServiceProcess.Exists>

< Message Text="服务存在吗?$(Exists)" />

于 2008-10-06T07:07:37.603 回答