You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用Java正则表达式提取Windows服务状态?

如何用Java正则表达式提取Windows服务状态?

假设你执行sc query <serviceName>后得到这样的输出:

TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

要提取其中的服务状态(比如RUNNING),可以用下面的方法:

核心思路

我们需要定位到包含STATE的行,然后捕获状态码(比如4)后面的状态关键词。这里用正则表达式精准匹配这个模式,同时兼容输出中可能存在的任意空格。

正则表达式

STATE\s*:\s*\d+\s+(\w+)

简单解释各个部分:

  • STATE\s*: 匹配"STATE :",\s*允许STATE:之间有任意数量的空格
  • \s*\d+\s+ 匹配状态数字(比如4)以及它前后的空格
  • (\w+) 捕获我们需要的状态词(比如RUNNING),这是一个捕获组,后续可以通过group(1)获取

Java代码示例

下面是完整的实现代码,你可以直接复用:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ServiceStatusExtractor {
    public static void main(String[] args) {
        // 这里模拟sc query的输出,实际场景中可以通过执行系统命令获取
        String scOutput = "TYPE : 10 WIN32_OWN_PROCESS\n" +
                          "STATE : 4 RUNNING (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)\n" +
                          "WIN32_EXIT_CODE : 0 (0x0)\n" +
                          "SERVICE_EXIT_CODE : 0 (0x0)\n" +
                          "CHECKPOINT : 0x0\n" +
                          "WAIT_HINT : 0x0";
        
        // 编译正则表达式
        Pattern pattern = Pattern.compile("STATE\\s*:\\s*\\d+\\s+(\\w+)");
        Matcher matcher = pattern.matcher(scOutput);
        
        if (matcher.find()) {
            String status = matcher.group(1);
            System.out.println("提取到的服务状态: " + status);
        } else {
            System.out.println("未能找到有效的服务状态信息");
        }
    }
}

运行结果

执行这段代码后,会输出:

提取到的服务状态: RUNNING

这个方案的好处是,即使sc query输出中的空格数量有变化(比如STATE : 4 RUNNING),正则也能正常匹配,鲁棒性不错。

内容的提问来源于stack exchange,提问作者user8874956

火山引擎 最新活动