2010-03-01 13 views
19

parte del mio codice non funzionava in x64, inizio a scavare e questo è dovuto ad un codice che richiama roba nativa tramite Runtime.getRuntime(). exec() ...cosa restituisce System.getProperty ("os.name") negli ultimi sistemi operativi Windows

Ma questo codice è probabilmente alcuni anni, che non tiene conto del sistema operativo più recente, e parte del codice seguente aspetto:

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; 

Vorrei risolvere questo per tutti i nuovi SO (w2008, windows 7, ...), ma non ho accesso ad un host di ogni tipo, e non voglio installare in una VM solo per vedere il valore, qualcuno sa di qualche lista da qualche parte? non ho trovato ancora.

EDIT: Avrei bisogno di: windows 7, windows 2003, windows 2008, windows 2008R2 Inoltre, io non sono il 1.6u18 quindi non preoccuparti per il bug che alcuni ragazzi hanno menzionato.

+0

Potresti essere interessato a questa domanda: http://stackoverflow.com/questions/1803075/crowdsourcing-a-complete-list-of-common-java-system-properties-and-known-values ​​Sfortunatamente, non ho Ho avuto il tempo di rilasciare le mie scoperte come un vero progetto open source però :( – sfussenegger

+1

Non è una risposta, ma è per questo che dovresti * sempre * avere un caso predefinito. –

+0

A C. Ross, c'è un'altra istruzione, ma in ogni caso fallisce dato che il suo valore predefinito è linux – Persimmonium

risposta

5

Molto probabilmente si potrebbe modificare il codice per dire

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

Provero una piccola variazione di questo: if (osName.equals ("Windows 95") ...) {// w95 etc } else if (osName.contains ("Windows")) {// nt e nuovi} else {// unix} – Persimmonium

2

Nessuna lista, ma su Windows7, con un JDK6_u18:

os.name = "Windows 7"

Nota: c'era una bug on JFK6_u14 and before, dove è visualizzato:

"Windows Vista" invece di "Windows 7" (anche se il sistema operativo era in realtà "Windows 7"), quindi fai attenzione!

Secondo this HowTo, dovrebbe essere "Windows 2003" per W2003.

2

come le versioni più recenti dovrebbero richiedere ciò che la linea NT richiesto, potrebbe effettivamente rendere più senso per verificare la presenza di vecchie versioni e altro utilizzare le impostazioni NT invece di controllare per le versioni più recenti, qualcosa di simile:

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

dipende dalla versione di Java che si sta eseguendo, mi sono imbattuto in questo bug:

http://bugs.sun.com/view_bug.do?bug_id=6819886

in modo fino a quando si utilizza una seconda versione del JDK deve restituire finestra s 7 bene.

Tuttavia, non sono sicuro di Windows Server 2008, suppongo che sia il Windows Server 2008.

C'è una lista ragionevolmente completa qui:

http://mindprod.com/jgloss/properties.html#OSNAME

+0

bug_id = 6819886 ... che ho appena menzionato 3 minuti fa;) – VonC

+2

* sigh * se solo avessi aggiunto la mia risposta 3 minuti prima, invece di cercare un elenco completo di valori per il povero ragazzo ... – Jon

+0

Grazie jon, apprezzato. Avevo già visto questa lista, come si vede mancano i sistemi operativi più recenti ... – Persimmonium

5

mi sono occupato di questo a Symantec quando Visual Cafe era ancora vivo .. Non consiglio assolutamente di farlo in questo modo. Il problema è che diversi fornitori possono fornire stringhe diverse. Suggerirei di utilizzare un modo specifico del sistema operativo per determinare la piattaforma.

È possibile utilizzare l'utilità "ver" su Windows e "uname" su sistemi di tipo Unix.

Potrebbe essere preferibile utilizzare "GetNativeSystemInfo" su Windows, ma ciò richiederebbe codice nativo.

Il motivo per cui suggerisco in questo modo piuttosto che fare affidamento sul metodo System.getProperty è perché devi solo gestire il sistema operativo sottostante anziché la JVM che si trova sulla parte superiore del sistema operativo e rimuovere il problema relativo alle diverse macchine virtuali segnalare cose diverse per la stessa piattaforma.

MODIFICA: Ovviamente dovresti provare diversi modi di ottenere le informazioni in quanto alcuni di essi potrebbero richiedere l'esecuzione della shell invece del solo comando. Ma se ti attacchi con bash dovrebbe essere buono. Praticamente prova a eseguire i comandi fino a quando uno di loro funziona ... non è bello, ma funzionerebbe.

+2

supportiamo solo Sun jvm, quindi questo non è un problema per noi, ma ti vedo punto ... – Persimmonium

4

Mentre questa non è una soluzione completa, è possibile ottenere un JDK a 32 bit ed eseguire un semplice codice di stampa os.name e os.version con diverse impostazioni di compatibilità.

Here're le os.name/os.version valori riportati da diversi JDK su un di Windows 8.1 scatola:

 
╔═════════════════╤════════════╤════════════╤════════════╤═══════════════╤═══════════════╤══════════════════════╤══════════════════════╗ 
║ 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 ║ 
╚═════════════════╧════════════╧════════════╧════════════╧═══════════════╧═══════════════╧══════════════════════╧══════════════════════╝ 
0

Questo codice vi darà l'ultimo nome di Windows come sistema operativo "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; 
    } 
Problemi correlati