Подтвердить что ты не робот

Что возвращает System.getProperty( "os.name" ) в последние ОС Windows

некоторые из моих кодов не выполнялись в 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,...), но у меня нет доступа к хосту каждого типа, и я не хочу устанавливать его на виртуальную машину, чтобы увидеть ценность, кто-нибудь знает о каком-то списке? еще не нашли.

EDIT: мне понадобятся: Windows 7, Windows 2003, Windows 2008, Windows 2008R2 Кроме того, я не 1.6u18, поэтому не стоит беспокоиться об ошибке, о которой говорили некоторые ребята.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 3

Хотя это не полное решение, вы можете получить 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 ║
╚═════════════════╧════════════╧════════════╧════════════╧═══════════════╧═══════════════╧══════════════════════╧══════════════════════╝

Ответ 4

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

os.name= "Windows 7"

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

"Windows Vista" вместо "Windows 7" (хотя ОС на самом деле была "Windows 7" ), поэтому будьте осторожны!

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

Ответ 5

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

Ответ 6

В зависимости от версии 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

Ответ 7

Этот код предоставит вам самое последнее имя ОС 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;
    }