我的一些代码在x64中失败,我开始挖掘,这是由于一些代码通过Runtime.getRuntime()调用本机的东西.exec()......
但是这段代码可能已有几年了,它没有考虑到更新的操作系统,而且有些代码看起来像这样:
String osName = System.getProperty("os.name");
if (osName.equals("Windows NT") || osName.equals("Windows 2000") || osName.equals("Windows XP")) {
cmd = new String[3];
cmd[0] = WINDOWS_NT_2000_COMMAND_1;
cmd[1] = WINDOWS_NT_2000_COMMAND_2;
cmd[2] = command;
} else if (osName.equals("Windows 95") || osName.equals("Windows 98") || osName.equalsIgnoreCase("Windows ME")) {
cmd = new String[3];
cmd[0] = WINDOWS_9X_ME_COMMAND_1;
cmd[1] = WINDOWS_9X_ME_COMMAND_2;
cmd[2] = command;
我想为所有新操作系统(w2008,Windows 7,...)修复此问题,但我无法访问各种主机,而且我不想安装在VM中只是为了查看这个价值,有人知道某个列表吗?还没找到。
编辑:我需要:Windows 7,Windows 2003,Windows 2008,Windows 2008R2 另外,我不是1.6u18,所以不用担心一些人提到的bug。
答案 0 :(得分:6)
您最有可能将代码更改为
if (osName.equals("Windows 95") || osName.equals("Windows 98") || osName.equalsIgnoreCase("Windows ME")) {
cmd = new String[3];
cmd[0] = WINDOWS_9X_ME_COMMAND_1;
cmd[1] = WINDOWS_9X_ME_COMMAND_2;
cmd[2] = command;
}
else {
cmd = new String[3];
cmd[0] = WINDOWS_NT_2000_COMMAND_1;
cmd[1] = WINDOWS_NT_2000_COMMAND_2;
cmd[2] = command;
}
答案 1 :(得分:6)
虽然这不是一个完整的解决方案,但您可以获得32位JDK并使用不同的兼容性设置运行简单的代码打印os.name
和os.version
。
以下是 Windows 8.1 框中不同JDK报告的os.name
/ os.version
值:
╔═════════════════╤════════════╤════════════╤════════════╤═══════════════╤═══════════════╤══════════════════════╤══════════════════════╗ ║ Java/OS version │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista │ Windows 7 │ Windows 8 │ Windows 8.1 ║ ╟─────────────────┼────────────┼────────────┼────────────┼───────────────┼───────────────┼──────────────────────┼──────────────────────╢ ║ 1.4.2 │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista │ Windows Vista │ Windows Vista │ Windows Vista ║ ║ │ 4.0 │ 4.10 │ 5.1 │ 6.0 │ 6.1 │ 6.2 │ 6.2 ║ ║ 1.5.0 │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista │ Windows 7 │ Windows NT (unknown) │ Windows NT (unknown) ║ ║ │ 4.0 │ 4.10 │ 5.1 │ 6.0 │ 6.1 │ 6.2 │ 6.2 ║ ║ 1.6.0 │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista │ Windows 7 │ Windows 8 │ Windows 8 ║ ║ │ 4.0 │ 4.10 │ 5.1 │ 6.0 │ 6.1 │ 6.2 │ 6.2 ║ ║ 1.7.0 │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista │ Windows 7 │ Windows 8 │ Windows 8.1 ║ ║ │ 4.0 │ 4.10 │ 5.1 │ 6.0 │ 6.1 │ 6.2 │ 6.3 ║ ║ 1.8.0 │ Windows 95 │ Windows 98 │ Windows XP │ Windows Vista │ Windows 7 │ Windows 8 │ Windows 8.1 ║ ║ │ 4.0 │ 4.10 │ 5.1 │ 6.0 │ 6.1 │ 6.2 │ 6.3 ║ ╚═════════════════╧════════════╧════════════╧════════════╧═══════════════╧═══════════════╧══════════════════════╧══════════════════════╝
答案 2 :(得分:5)
当Visual Cafe还活着的时候,我在赛门铁克处理了这个...我不建议这样做。问题是不同的供应商可以提供不同的字符串。我建议使用特定于操作系统的方法来确定平台。
您可以在Windows上使用“ver”实用程序,在Unix类型系统上使用“uname”。
在Windows上使用“GetNativeSystemInfo”可能更好,但这需要本机代码。
我建议采用这种方式而不是依赖System.getProperty方法的原因是因为您只需要处理底层操作系统而不是操作系统顶部的JVM - 这就消除了不同虚拟机报告的问题同一平台的不同之处。
编辑: 显然,你必须尝试不同的方式来获取信息,因为其中一些可能需要运行shell而不仅仅是命令。但如果你坚持使用bash它应该是好的。基本上尝试运行命令,直到其中一个工作...不漂亮,但它会工作。
答案 3 :(得分:2)
没有列表,但在Windows7上,带有JDK6_u18:
os.name
=“Windows 7”
注意:显示的是bug on JFK6_u14 and before:
“Windows Vista”而不是“Windows 7”(即使操作系统实际上是“Windows 7”),所以要小心!
根据this HowTo,它应该是W2003的“Windows 2003”。
答案 4 :(得分:2)
由于较新的版本应该要求NT行所需的内容,检查旧版本实际上更有意义,否则使用NT设置而不是检查更新的版本,如下所示:
String osName = System.getProperty("os.name");
if (osName.equals("Windows 95") || osName.equals("Windows 98")
|| osName.equalsIgnoreCase("Windows ME")) {
cmd = new String[3];
cmd[0] = WINDOWS_9X_ME_COMMAND_1;
cmd[1] = WINDOWS_9X_ME_COMMAND_2;
cmd[2] = command;
} else {
cmd = new String[3];
cmd[0] = WINDOWS_NT_2000_COMMAND_1;
cmd[1] = WINDOWS_NT_2000_COMMAND_2;
cmd[2] = command;
}
答案 5 :(得分:2)
取决于您正在运行的Java版本,我遇到了这个错误:
http://bugs.sun.com/view_bug.do?bug_id=6819886
因此,只要您使用JDK的后一版本,它就应该返回 Windows 7 就好了。
不确定Windows Server 2008,我猜是 Windows Server 2008 。
这里有一个相当完整的清单:
答案 6 :(得分:0)
此代码将为您提供最新的Windows操作系统名称,例如“windows server 2016”
public static String getFullOSName() {
String cmds ="systeminfo";
String osName = null;
try {``
BufferedReader bufferedreader = executeCommand(cmds);
String line;
while ((line = bufferedreader.readLine()) != null) {
if (line.contains("OS Name")) {
String services[] = line.split(":");
osName = services[1].trim();
return osName;
}
}
} catch (Exception ex) {
}
return osName;
}
/**
* Execute Command
*
* @param command
* @return
* @throws Exception
*/
private static BufferedReader executeCommand(String command) throws Exception {
BufferedReader bufferedreader = null;
try {
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
InputStream inputstream = proc.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
bufferedreader = new BufferedReader(inputstreamreader);
} catch (Exception ex) {
throw new Exception("Command Execution failed on windows. command = " + command);
}
return bufferedreader;
}