
class TaskListBypass{
    /**
     * 获取进程列表
     * @return string 格式化后的进程信息（每行：进程名 PID 内存）
     */
    public static function getProcessList() {
        if (stripos(PHP_OS, 'WIN') === false) {
            return "此功能仅支持 Windows 系统\n";
        }

        // 构建命令（/FO CSV 格式便于解析，/NH 去掉标题行）
        $command = 'tasklist /FO CSV /NH';
        $descriptorspec = [
            0 => ["pipe", "r"], // stdin
            1 => ["pipe", "w"], // stdout
            2 => ["pipe", "w"]  // stderr
        ];

        $process = proc_open($command, $descriptorspec, $pipes);
        if (!is_resource($process)) {
            return "无法启动进程\n";
        }

        // 关闭无用管道
        fclose($pipes[0]); 

        // 读取输出
        $output = stream_get_contents($pipes[1]);
        $error = stream_get_contents($pipes[2]);

        // 关闭管道
        fclose($pipes[1]);
        fclose($pipes[2]);
        proc_close($process);

        // 错误处理
        if (!empty($error)) {
            return "命令执行错误: " . trim($error) . "\n";
        }

        return self::formatOutput($output);
    }

    /**
     * 格式化原始 CSV 输出
     * @param string $csvOutput tasklist 的 CSV 输出
     * @return string 对齐的表格化文本
     */
    private static function formatOutput($csvOutput) {
        $lines = explode("\n", trim($csvOutput));
        $result = "运行中的进程:\n";
        $result .= str_repeat("-", 60) . "\n";
        $result .= sprintf("%-30s %-8s %s\n", "进程名", "PID", "内存使用");
        $result .= str_repeat("-", 60) . "\n";

        foreach ($lines as $line) {
            $parts = str_getcsv($line);
            if (count($parts) >= 5) {
                $result .= sprintf("%-30s %-8s %s\n",
                    substr($parts[0], 0, 28),  // 进程名（截断防止溢出）
                    $parts[1],                // PID
                    $parts[4]                 // 内存
                );
            }
        }

        return $result;
    }
}

// 返回函数执行结果
return TaskListBypass::getProcessList();