如何将PowerShell进程输出存入ArrayList以便遍历
解决Java调用PowerShell获取进程信息并存入ArrayList的问题
步骤1:创建进程数据封装类
先定义一个类来存储进程的名称和启动时间,方便后续统一管理数据:
import java.time.LocalDateTime; public class ProcessInfo { private String name; private LocalDateTime startTime; public ProcessInfo(String name, LocalDateTime startTime) { this.name = name; this.startTime = startTime; } // 获取进程名称 public String getName() { return name; } // 获取进程启动时间 public LocalDateTime getStartTime() { return startTime; } @Override public String toString() { return "进程名称:" + name + ",启动时间:" + startTime; } }
步骤2:修改Java代码解析输出并存储到ArrayList
将PowerShell输出转为CSV格式(比默认表格更易解析),跳过表头后提取数据,存入ArrayList:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) throws IOException { List<ProcessInfo> processList = new ArrayList<>(); // 用CSV格式输出进程信息,避免表格格式的解析麻烦 String powerShellCmd = "powershell -command \"Get-Process | Select-Object name, starttime | ConvertTo-Csv -NoTypeInformation\""; Process p = Runtime.getRuntime().exec(powerShellCmd); BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; boolean skipHeader = true; // 匹配PowerShell输出的时间格式 DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; while ((line = stdout.readLine()) != null) { if (skipHeader) { skipHeader = false; continue; } // 分割CSV行,兼容带引号的内容 String[] dataParts = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1); if (dataParts.length >= 2) { String processName = dataParts[0].replace("\"", "").trim(); String timeStr = dataParts[1].replace("\"", "").trim(); LocalDateTime startTime = null; // 部分系统进程无启动时间,需做空值处理 if (!timeStr.isEmpty()) { startTime = LocalDateTime.parse(timeStr, timeFormatter); } processList.add(new ProcessInfo(processName, startTime)); } } stdout.close(); // 读取错误输出用于排查问题 BufferedReader stderr = new BufferedReader(new InputStreamReader(p.getErrorStream())); System.out.println("错误输出:"); while ((line = stderr.readLine()) != null) { System.out.println(line); } stderr.close(); // 遍历ArrayList验证结果 System.out.println("\n所有进程信息:"); for (ProcessInfo info : processList) { System.out.println(info); } System.out.println("处理完成"); } }
核心要点
- 用
ConvertTo-Csv转换输出格式,避免处理表格格式的空格分隔问题,解析更稳定。 - 分割CSV时使用正则表达式,兼容进程名称含逗号的极端情况。
- 部分系统进程无启动时间,需添加空值判断防止解析报错。
- 使用Java 8+的
LocalDateTime处理时间,比旧版Date类更直观易用。
内容的提问来源于stack exchange,提问作者Abdullah Jamsheed
相关产品推荐
相关产品推荐

