You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:46:12