Удалите ненужный символ из вывода WMIC, используя Java replace () - PullRequest
0 голосов
/ 17 мая 2018

Я сейчас работаю над проверкой конфигурации системы.Для этого мне нужно извлечь операционную систему тестируемой машины и проверить ее на файл .csv.

К сожалению, во время тестирования одна машина доставила мне немало головной боли: после извлечения строки изКоманда WMI, символ ÿ вставляется там, где должен быть пробел.В результате, сравнение строк неверно, хотя на самом деле это не так.Вот небольшой блок кода, который поможет вам понять процесс:

    //The command to execute
    String masterCommand = "wmic os get ";
    String command = "Caption";

    //The process that executes the command
    ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", masterCommand + command);
    Process p = pb.start();
    p.waitFor();
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    //The command result stored in a string
    while((line = br.readLine()) != null) {
        result += line;
    }
    //The string cleaned of unwanted substring and trailing spaces
    result = result.replace(command, "").trim();

Ожидаемый результат будет Microsoft Windows 10 Enterprise, но в итоге он будет Microsoft Windowsÿ10 Enterprise

Я думал, что с использованием Java *Метод 1012 * решит проблему, но ничего не даст.Вот замена, которую я сейчас использую.

    result = result.replace("(?i)windows.", "Windows ");

Я должен добавить, что команда (wmic os get Caption) выводит правильный результат на cmd, а также, кажется, правильно выводит его в файл .txt.


TL; DR

Я использую wmic внутри Java с использованием ProcessBuilder и получаю нежелательный символ (ÿ), который не обнаруживаетсяreplace().

Что я могу сделать, чтобы получить правильный результат (избегая записи в файл и затем читая его)?


Пожалуйста, укажителюбая необходимость в разъяснениях или исправлениях.

Заранее благодарим за ваши ответы.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Я нашел решение, которое немного неуклюже, но работает для меня.

Поскольку нежелательный символ является символом Unicode, я просто очищаю строку, сохраняя только символы ASCII.

result = result.replaceAll("[^ -~]", "").trim().replaceAll(" +", " ");
result = result.replace("(?i)windows[^ ]", "Windows ");

Для этого он принимает строку result и заменяет ничем ("" пустая строка) все символы, значение которых находится вне диапазона от (пробел) до ~ ( для печати ASCII ).

Дополнительный код просто обрезает все пробелы и заменяет 2+ пробелов на один.В последней строке рассматриваются потенциальные печатаемые символы ASCII, находящиеся между «Windows» и его версией (например, 7, XP, Vista и т. Д.).

0 голосов
/ 17 мая 2018

Вы пробовали это?

     String result = "Microsoft Windowsÿ10 Enterprise";
     result = result.replace('ÿ', ' ');
     System.out.println(result); //prints Microsoft Windows 10 Enterprise
...