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



我目前正在研究系统配置检查器。为此,我需要检索被测计算机的操作系统,并针对.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 的replace()方法可以解决问题,但它什么也没做。这是我目前正在使用的替代品。

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

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


TL;博士

我在 Java 中使用ProcessBuilder使用 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字符串,并用任何字符(""空字符串)替换所有值超出(空格)到CC_14范围(可打印 ASCII)的字符。

附加代码只是修剪所有空格,并将 2+ 个空格替换为一个空格。 最后一行负责"Windows"与其版本(例如7,XP,Vista等)之间潜在的可打印ASCII字符。

最新更新