System.getProperty(“os.name“)在最新的Windows操作系统中返回什么

hgb9j2n6  于 2023-08-07  发布在  Windows
关注(0)|答案(8)|浏览(121)

我的一些代码在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,...)修复这个问题,但我没有访问每一种主机的权限,我不想安装在虚拟机只是为了看到它的价值,有人知道一些列表吗?我还没有找到任何东西.
编辑:我需要:windows 7,windows 2003,windows 2008,windows 2008R2还有,我不是1. 6u18,所以不用担心一些家伙提到的bug。

goqiplq2

goqiplq21#

虽然这不是一个完整的解决方案,但您可以获得一个32位JDK,并运行一个简单的代码打印os.nameos.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 ║
╚═════════════════╧════════════╧════════════╧════════════╧═══════════════╧═══════════════╧══════════════════════╧══════════════════════╝

字符串

efzxgjgh

efzxgjgh2#

最有可能的是你可以把代码改成

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

字符串

ggazkfy8

ggazkfy83#

我在赛门铁克处理过这个问题,当时Visual Cafe还活着...我根本不建议这样做。问题是不同的供应商可以提供不同的字符串。我建议使用操作系统特定的方式来确定平台。
您可以在Windows上使用“ver”实用程序,在Unix类型系统上使用“uname”实用程序。
在Windows上使用“GetNativeSystemInfo”可能更好,但这需要本机代码。
我建议使用这种方式而不是依赖System.getProperty方法的原因是,这样你就只需要处理底层操作系统,而不是位于操作系统之上的JVM--这消除了不同VM为同一平台报告不同内容的问题。
编辑:显然,你必须尝试不同的方法来获取信息,因为其中一些可能需要运行shell而不仅仅是命令。但是如果你坚持使用bash,它应该是好的。基本上尝试运行命令,直到其中一个工作...虽然不漂亮,但它会工作。

piok6c0g

piok6c0g4#

没有列表,但在Windows7上,使用JDK6_u18:
os.name =“Windows 7”
注:有一个bug on JFK6_u14 and before,其中显示:
“Windows Vista”而不是“Windows 7”(尽管操作系统实际上是“Windows 7”),所以要小心!
根据this HowTo,对于W2003应该是“Windows 2003”。

lrl1mhuk

lrl1mhuk5#

由于较新版本应该要求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;
}

字符串

ghhkc1vu

ghhkc1vu6#

取决于你运行的Java版本,我遇到了这个bug:
http://bugs.sun.com/view_bug.do?bug_id=6819886
因此,只要您使用较新版本的JDK,它应该会返回Windows 7
不确定Windows Server 2008,我猜是Windows Server 2008。
这里有一个相当完整的列表:
http://mindprod.com/jgloss/properties.html#OSNAME

1l5u6lss

1l5u6lss7#

此代码将为您提供最新的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;
    }

字符串

yi0zb3m4

yi0zb3m48#

由于这是在不同的搜索上下文下的第一个命中,我将抛出这一点给其他可能更广泛地搜索这个主题的人:
我用它来确定广泛的操作系统(windows vs Mac vs Linux,等等)。它是一个枚举,您可以在程序中的任何地方利用不同的公共静态方法。
public enum OS {

WIN, MAC, LINUX, SOLARIS, FREEBSD;

private static OS thisOS;

private static void setThisOS() {
    String os = System.getProperty("os.name").toLowerCase();
    if (os.contains("win")) {
        thisOS = OS.WIN;
    }
    else if (os.contains("mac")) {
        thisOS = OS.MAC;
    }
    else if (os.contains("linux")) {
        thisOS = OS.LINUX;
    }
    else if (os.contains("sun")) {
        thisOS = OS.SOLARIS;
    }
    else if (os.contains("free")) {
        thisOS = OS.FREEBSD;
    }
}

public static boolean isWindows() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.WIN);
}

public static boolean isMac() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.MAC);
}

public static boolean isLinux() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.LINUX);
}

public static boolean isWinMac() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.WIN) || thisOS.equals(OS.MAC);
}

public static boolean isSun() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.SOLARIS);
}

public static boolean isBSD() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.FREEBSD);
}

public static boolean isNix() {
    if (thisOS == null) {
        setThisOS();
    }
    return thisOS.equals(OS.LINUX) || thisOS.equals(OS.SOLARIS) || thisOS.equals(OS.FREEBSD);
}

字符串
}

相关问题