Java System.getProperty(“os.name”)在最新的Windows OSs中返回什么

Java System.getProperty(“os.name”)在最新的Windows OSs中返回什么,java,windows,Java,Windows,我的一些代码在x64中失败,我开始挖掘,这是由于一些代码通过Runtime.getRuntime().exec()调用本机内容造成的 但这段代码可能已经有几年的历史了,它没有考虑到较新的操作系统,其中一些代码如下所示: String osName = System.getProperty("os.name"); if (osName.equals("Windows NT") || osName.equals("Windows 2000") || osName.equals("Window

我的一些代码在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;
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;
}
我想为所有新的OSs(w2008,Windows7,…)修复这个问题,但是我没有访问每种类型的主机的权限,我不想在VM中安装只是为了查看其价值,有人知道某个地方的列表吗?我还没有找到

编辑:我需要:Windows7,Windows2003,Windows2008,Windows2008R2
另外,我不是1.6u18,所以不用担心一些人提到的bug。

没有列表,但在Windows7上,使用JDK6_u18:

os.name
=“Windows 7”

注意:有一个,其中显示:

“Windows Vista”而不是“Windows 7”(即使操作系统实际上是“Windows 7”),所以要小心


根据,W2003应该是“Windows 2003”。

因为新版本应该需要NT行所需的内容,所以检查旧版本实际上可能更有意义,或者使用NT设置而不是检查新版本,如下所示:

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;
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;
}

根据您运行的Java版本,我遇到了以下错误:

因此,只要使用JDK的后一个版本,它就会返回Windows 7

不过,我不确定Windows Server 2008,我猜是Windows Server 2008

这里有一个相当完整的列表:


最有可能的是,您可以将代码更改为

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;
}

当VisualCafe还活着的时候,我在赛门铁克处理过这件事。。。我根本不建议这样做。问题是不同的供应商可以提供不同的字符串。我建议使用特定于操作系统的方法来确定平台

您可以在Windows上使用“ver”实用程序,在Unix类型的系统上使用“uname”

在Windows上使用“GetNativeSystemInfo”可能更好,但这需要本机代码

我建议采用这种方式而不是依赖System.getProperty方法的原因是,这样您只需处理底层操作系统,而不必处理位于操作系统之上的JVM,这样就消除了不同虚拟机为同一平台报告不同内容的问题

编辑:
显然,您必须尝试不同的方法来获取信息,因为其中一些方法可能需要运行shell而不仅仅是命令。但是如果你坚持使用bash,它应该是好的。基本上试着运行命令,直到其中一个起作用。。。虽然这不是一个完整的解决方案,但您可以使用32位JDK并使用不同的兼容性设置运行简单的代码打印
os.name
os.version

以下是Windows 8.1上不同JDK报告的
os.name
/
os.version
值:

╔═════════════════╤════════════╤════════════╤════════════╤═══════════════╤═══════════════╤══════════════════════╤══════════════════════╗ ║ Java/OS版本│ 视窗95│ 视窗98│ 视窗XP│ Windows Vista│ 视窗7│ 视窗8│ Windows 8.1║ ╟─────────────────┼────────────┼────────────┼────────────┼───────────────┼───────────────┼──────────────────────┼──────────────────────╢ ║ 1.4.2 │ 视窗95│ 视窗98│ 视窗XP│ Windows Vista│ Windows Vista│ Windows Vista│ Windows Vista║ ║ │ 4│ 4.10│ 5.1│ 6│ 6.1│ 6.2│ 6.2║ ║ 1.5.0 │ 视窗95│ 视窗98│ 视窗XP│ Windows Vista│ 视窗7│ Windows NT(未知)│ Windows NT(未知)║ ║ │ 4│ 4.10│ 5.1│ 6│ 6.1│ 6.2│ 6.2║ ║ 1.6.0 │ 视窗95│ 视窗98│ 视窗XP│ Windows Vista│ 视窗7│ 视窗8│ 视窗8║ ║ │ 4│ 4.10│ 5.1│ 6│ 6.1│ 6.2│ 6.2║ ║ 1.7.0 │ 视窗95│ 视窗98│ 视窗XP│ Windows Vista│ 视窗7│ 视窗8│ Windows 8.1║ ║ │ 4│ 4.10│ 5.1│ 6│ 6.1│ 6.2│ 6.3║ ║ 1.8.0 │ 视窗95│ 视窗98│ 视窗XP│ Windows Vista│ 视窗7│ 视窗8│ Windows 8.1║ ║ │ 4│ 4.10│ 5.1│ 6│ 6.1│ 6.2│ 6.3║ ╚═════════════════╧════════════╧════════════╧════════════╧═══════════════╧═══════════════╧══════════════════════╧══════════════════════╝
此代码将为您提供最新的