我目前正在研究系统配置检查器。为此,我需要检索被测计算机的操作系统,并针对.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字符。