что возвращает System.getProperty ("os.name") в последних ОС Windows - PullRequest
20 голосов
/ 01 марта 2010

часть моего кода не работала в 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, так что не беспокойтесь об ошибке, упомянутой некоторыми парнями.

Ответы [ 7 ]

6 голосов
/ 29 июня 2015

Хотя это не полное решение, вы можете получить 32-разрядный JDK и запустить простую печать кодов os.name и os.version с различными настройками совместимости.

Вот значения os.name / os.version, сообщенные различными JDK в окне Windows 8.1 :

╔═════════════════╤════════════╤════════════╤════════════╤═══════════════╤═══════════════╤══════════════════════╤══════════════════════╗
║ 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 ║
╚═════════════════╧════════════╧════════════╧════════════╧═══════════════╧═══════════════╧══════════════════════╧══════════════════════╝
6 голосов
/ 01 марта 2010

Скорее всего, вы можете изменить код на

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 голосов
/ 01 марта 2010

Я имел дело с этим в Symantec, когда Visual Cafe был еще жив ... Я вообще не рекомендую делать это таким образом. Проблема в том, что разные поставщики могут поставлять разные строки. Я бы предложил использовать конкретный способ ОС для определения платформы.

Вы можете использовать утилиту "ver" в Windows и "uname" в системах типа Unix.

Возможно, лучше использовать «GetNativeSystemInfo» в Windows, но для этого потребуется собственный код.

Причина, по которой я предлагаю этот способ вместо того, чтобы полагаться на метод System.getProperty, заключается в том, что вам приходится иметь дело только с базовой ОС, а не с виртуальной машиной Java, расположенной на вершине ОС, - и это устраняет проблему, когда разные виртуальные машины сообщают разные вещи для одной и той же платформы.

EDIT: Очевидно, вам придется попробовать разные способы получения информации, поскольку для некоторых из них может потребоваться запуск оболочки вместо просто команды. Но если вы придерживаетесь Bash, это должно быть хорошо. В основном попробуйте запускать команды, пока одна из них не сработает ... не очень, но она сработает.

2 голосов
/ 01 марта 2010

Зависит от версии Java, которую вы используете, я сталкивался с этой ошибкой:

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

2 голосов
/ 01 марта 2010

Поскольку более новые версии должны требовать то, что требуется для строки 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;
}
2 голосов
/ 01 марта 2010

Нет списка, но в Windows7 с JDK6_u18:

os.name = "Windows 7"

Примечание: в JFK6_u14 и до была ошибка где отображается:

«Windows Vista» вместо «Windows 7» (хотя операционная система фактически была «Windows 7»), так что будьте осторожны!

Согласно этоКак , это должна быть "Windows 2003" для W2003.

0 голосов
/ 21 декабря 2016

Этот код даст вам самое последнее имя ОС 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...