2010-03-01 5 views
19

einige meiner Code war in x64 fehlgeschlagen, ich beginne zu graben und dies ist aufgrund einiger Code, der native Sachen über Runtime.getRuntime() aufruft. exec() ...Was gibt System.getProperty ("os.name") zurück in den neuesten Windows-Betriebssystemen

Aber dieser Code ist wahrscheinlich einige Jahre alt, es nicht zu berücksichtigen neueren OS dauert, und einige der Code sieht wie folgt aus:

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; 

ich möchte dieses Problem zu beheben für alle neuen Betriebssysteme (w2008, Windows 7, ...), aber ich habe keinen Zugriff auf einen Host von jeder Art, und ich möchte nicht in einer VM installieren, nur um den Wert zu sehen, weiß jemand eine Liste irgendwo? habe noch keine gefunden.

EDIT: Ich würde brauchen: Windows 7, Windows 2003, Windows 2008, Windows 2008R2 Auch ich bin nicht der 1.6u18 also keine Sorgen über den Fehler einige Jungs erwähnt.

+0

Sie könnten an dieser Frage interessiert sein: http://stackoverflow.com/questions/1803075/crowdingsourcing-a-complete-list-of-common-java-system-properties-and-known-values ​​Leider habe ich Ich hatte keine Zeit, meine Ergebnisse zu veröffentlichen als ein richtiges Open-Source-Projekt jedoch :( – sfussenegger

+1

Es ist keine Antwort, aber deshalb sollten Sie * immer * einen Standardfall haben. –

+0

Um C. Ross gibt es eine else-Anweisung, aber es scheitert sowieso, da es standardmäßig ein Linux – Persimmonium

Antwort

5

Wahrscheinlich haben Sie den Code sagen

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

Ich werde eine kleine Variante davon testen: if (osName.equals ("Windows 95") ...) {// w95 etc } else if (osName.contains ("Windows")) {// nt und neue} else {// unix} – Persimmonium

2

Keine Liste, aber auf Windows7, mit einem JDK6_u18:

os.name = "Windows 7"

Hinweis: es gab eine bug on JFK6_u14 and before, wo es angezeigt:

"Windows Vista" statt "Windows 7" (obwohl das Betriebssystem eigentlich "Windows 7" war), sei also vorsichtig!

Nach this HowTo sollte es "Windows 2003" für W2003 sein.

2

Wie neuere Versionen sollten erfordern, was die NT Linie erforderlich, könnte es tatsächlich mehr Sinn machen, für alte Versionen zu überprüfen und sonst die Einstellungen NT verwenden, anstatt für neuere Versionen der Überprüfung, etwa so:

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

Abhängig von der Version von Java, dass Sie laufen, stieß ich auf diesen Fehler:

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

so lange, wie Sie eine letztere Version des JDK verwenden es Fenster zurückkehren sollte s 7 ganz gut.

Ich bin nicht sicher über Windows Server 2008, aber ich denke Windows Server 2008.

Es gibt eine ziemlich vollständige Liste hier:

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

+0

bug_id = 6819886 ... was ich vor 3 Minuten gerade erwähnt;) – VonC

+2

* seufz * wenn ich nur hinzugefügt hätte meine Antwort 3 Minuten vorher, anstatt nach einer kompletten Liste von Werten für den armen Kerl zu suchen ... – Jon

+0

Danke jon, geschätzt. Ich habe diese Liste bereits gesehen, wie Sie sehen, die neueren Betriebssysteme fehlen ... – Persimmonium

5

ich damit bei Symantec, wenn Visual Cafe noch am Leben war befasste sich ändern könnte .. Ich empfehle es nicht so. Das Problem besteht darin, dass verschiedene Anbieter unterschiedliche Zeichenfolgen bereitstellen können. Ich würde vorschlagen, einen OS-spezifischen Weg zu verwenden, um die Plattform zu bestimmen.

Sie könnten das Dienstprogramm "ver" unter Windows und "uname" auf Unix-Systemen verwenden.

Es könnte besser sein, "GetNativeSystemInfo" unter Windows zu verwenden, aber das würde nativen Code erfordern.

Der Grund, warum ich eher auf die System.getProperty-Methode angewiesen bin, ist, weil Sie dann nur mit dem zugrundeliegenden Betriebssystem statt der JVM auf dem Betriebssystem arbeiten müssen - und das Problem beseitigt, wo verschiedene VMs berichten Sie verschiedene Dinge für die gleiche Plattform.

EDIT: Offensichtlich müssen Sie verschiedene Möglichkeiten zum Abrufen der Informationen versuchen, da einige von ihnen möglicherweise die Shell statt nur den Befehl ausführen müssen. Aber wenn Sie bei bash bleiben, sollte es gut sein. Im Grunde versuchen Sie Befehle auszuführen, bis einer von ihnen funktioniert ... nicht schön, aber es würde funktionieren.

+2

wir unterstützen nur Sun jvm, also ist das kein Problem für uns, aber ich sehe Sie Punkt ... – Persimmonium

4

Obwohl dies keine vollständige Lösung ist, können Sie ein 32-Bit-JDK erhalten und einen einfachen Code drucken os.name und os.version mit verschiedenen Kompatibilitätseinstellungen.

Here're die os.name/os.version Werte von verschiedenen JDKs auf einem Windows-8.1 Box gemeldet:

 
╔═════════════════╤════════════╤════════════╤════════════╤═══════════════╤═══════════════╤══════════════════════╤══════════════════════╗ 
║ 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

Dieser Code finden Sie die neuesten Windows-Betriebssystem Namen geben wie "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; 
    } 
Verwandte Themen