当前位置:  开发笔记 > 编程语言 > 正文

需要一种以编程方式检查Windows服务状态的方法

如何解决《需要一种以编程方式检查Windows服务状态的方法》经验,为你挑选了2个好方法。

情况如下:

我被要求使用InstallAnywhere 8,这是一个基于Java的安装程序IDE,允许启动和停止Windows服务,但没有内置方法来查询它们的状态.幸运的是,它允许您使用Java创建自定义操作,可以在安装过程中随时调用(通过我认为是一个相当复杂的API).

我只需要一些能告诉我特定服务是否已启动或停止的内容.

IDE还允许调用批处理脚本,所以这也是一个选项,虽然一旦运行脚本,几乎没有办法验证它是否成功,所以我试图避免这种情况.

欢迎任何建议或批评.



1> Yuval..:

这就是我必须做的事情.这很难看,但效果很好.

String STATE_PREFIX = "STATE              : ";

String s = runProcess("sc query \""+serviceName+"\"");
// check that the temp string contains the status prefix
int ix = s.indexOf(STATE_PREFIX);
if (ix >= 0) {
  // compare status number to one of the states
  String stateStr = s.substring(ix+STATE_PREFIX.length(), ix+STATE_PREFIX.length() + 1);
  int state = Integer.parseInt(stateStr);
  switch(state) {
    case (1): // service stopped
      break;
    case (4): // service started
      break;
   }
}

runProcess是一个私有方法,它将给定的字符串作为命令行进程运行并返回结果输出.正如我所说,丑陋,但有效.希望这可以帮助.


runProcess包含什么?

2> RealHowTo..:

您可以在运行中创建一个小型VBS,启动它并捕获其返回码.

import java.io.File;
import java.io.FileWriter;

public class VBSUtils {
  private VBSUtils() {  }

  public static boolean isServiceRunning(String serviceName) {
    try {
        File file = File.createTempFile("realhowto",".vbs");
        file.deleteOnExit();
        FileWriter fw = new java.io.FileWriter(file);

        String vbs = "Set sh = CreateObject(\"Shell.Application\") \n"
                   + "If sh.IsServiceRunning(\""+ serviceName +"\") Then \n"
                   + "   wscript.Quit(1) \n"
                   + "End If \n"
                   + "wscript.Quit(0) \n";
        fw.write(vbs);
        fw.close();
        Process p = Runtime.getRuntime().exec("wscript " + file.getPath());
        p.waitFor();
        return (p.exitValue() == 1);
    }
    catch(Exception e){
        e.printStackTrace();
    }
    return false;
  }


  public static void main(String[] args){
    //
    // DEMO
    //
    String result = "";
    msgBox("Check if service 'Themes' is running (should be yes)");
    result = isServiceRunning("Themes") ? "" : " NOT ";
    msgBox("service 'Themes' is " + result + " running ");

    msgBox("Check if service 'foo' is running (should be no)");
    result = isServiceRunning("foo") ? "" : " NOT ";
    msgBox("service 'foo' is " + result + " running ");
  }

  public static void msgBox(String msg) {
    javax.swing.JOptionPane.showConfirmDialog((java.awt.Component)
       null, msg, "VBSUtils", javax.swing.JOptionPane.DEFAULT_OPTION);
  }
}

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有