Что возвращает 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, поэтому не стоит беспокоиться об ошибке, о которой говорили некоторые ребята.
Ответы
Ответ 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;
}