如何用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




