使用 Java replace() 从 WMIC 输出中删除不需要的字符

Remove unwanted character from WMIC output using Java replace()

我目前正在研究系统配置检查器。为此,我需要检索被测机器的操作系统并针对 .csv 文件对其进行测试。

不幸的是,在测试时,一台机器让我非常头疼:从 WMI 命令检索字符串后,ÿ 字符插入到 space 应该插入的位置。结果,我的字符串比较是错误的,而实际上它不应该。这是一个小代码块,可以帮助您理解该过程:

    //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的replace()方法可以解决问题,但没有任何作用。这是我目前正在使用的替换。

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

我应该补充一点,命令 (wmic os get Caption) 在 cmd 上输出正确的结果,而且似乎也正确地将其输出到 .txt 文件。


TL;DR

我使用 ProcessBuilder 在 Java 中使用 wmic 并得到了 replace() 未检测到的不需要的字符 (ÿ)。

我该怎么做才能得到正确的结果(避免写入文件然后读取它)?


请指出任何需要澄清或纠正的地方。

提前感谢您的回答。

你试过吗?

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

我找到了一个有点笨拙但对我有用的解决方案。

因为不需要的字符是 Unicode 字符,所以我只保留 ASCII 字符来清理字符串。

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

它的作用是获取 result 字符串并替换为空字符串("" 空字符串)所有值在 </code> 之外的字符(白色space) 到 <code>~ 范围 (printable ASCII).

附加代码简单地修剪所有 spaces 并将 2+ spaces 替换为一个。 最后一行处理 "Windows" 及其版本(例如 7、XP、Vista 等)之间的潜在可打印 ASCII 字符。