Как извлечь конкретные строки из файла msinfo32 с помощью кода Java - PullRequest
0 голосов
/ 04 октября 2019

Я пишу код для извлечения подробностей системной информации, например, оперативной памяти, скорости процессора и помещения их в текстовый файл.

public void getSpecs(){
    //run a cmd command to convert msinfo32 to .txt file
   String[] command = {
        "cmd",
    };
    Process p;
    try{
        p= Runtime.getRuntime().exec(command);
        new Thread(new Sec(p.getErrorStream(), System.err)).start();
        new Thread(new Sec(p.getInputStream(), System.out)).start();
        PrintWriter pw= new PrintWriter(p.getOutputStream());

        pw.println("msinfo32 /report .\\specs.txt");
        pw.close();
        p.waitFor();
    }catch(Exception e){
        e.printStackTrace();
    }   
  }
}

Этот процесс занимает много времени и приводит к преобразованию всего файла.

1 Ответ

0 голосов
/ 04 октября 2019

msinfo32 экспортирует информацию о компьютере в файл. Ожидается, что это займет некоторое время, так как он получает огромный экспорт для каждого компонента компьютера / Windows.

Я сделал нечто подобное, используя powershell

    public static void main(String[] args) throws IOException {
        //Set the commands
        String cmd = "powershell.exe  get-WmiObject ";
        String[] win32CmdA = {"win32_processor", "win32_computerSystem", "win32_logicaldisk"};

        for (String win32Cmd : win32CmdA) {
            String info = runCmd(cmd + win32Cmd,
                    "MaxClockSpeed",
                    "TotalPhysicalMemory",
                    "DeviceID",
                    "FreeSpace");//Add as many atributes you want to return from powershell output
            System.out.println(info); // You can use a file writer here
        }

//        //You can handle ErrorStream here
//        String line;
//        BufferedReader stderr = new BufferedReader(new InputStreamReader(
//                powerShellProcess.getErrorStream()));
//        while ((line = stderr.readLine()) != null) {
//            System.out.println(line);
//        }
    }

    private static String runCmd(String cmd, String... attrs) throws IOException {
        Process powerShellProcess = Runtime.getRuntime().exec(cmd);
        powerShellProcess.getOutputStream().close();

        String line;
        String result="";
        BufferedReader stdout = new BufferedReader(new InputStreamReader(powerShellProcess.getInputStream()));
        while ((line = stdout.readLine()) != null) {
            if (line != null && line.contains(":")) {
                String nameValue[] = line.split(":");
                if (Arrays.asList(attrs).contains(nameValue[0].trim())) {
                    result+=nameValue[0] + " - " + nameValue[1] + "\n";
                }
            }
        }
        stdout.close();
        return result;
    }

Приведенный выше код вызывает инструментарий управления WindowsКлассы (WMI) в PowerShell для определенных компонентов (процессор, компьютерная система и логический диск).

Затем вы определяете, какие значения следует брать из выходных данных PowerShell, например MaxClockSpeed, TotalPhysicalMemory и т. Д.

Есливы меняете System.out.println (информация);с помощью средства записи файлов вы будете иметь эту информацию в файле.

Пример вывода (для запуска потребовалось ~ 3 секунды)

DeviceID           -  CPU0
MaxClockSpeed      -  3401

TotalPhysicalMemory  -  17053949952

DeviceID      -  C
FreeSpace     -  56341774336
DeviceID      -  D
FreeSpace     -  
DeviceID      -  F
FreeSpace     -  373687742464
...