2010-03-01 137 views
19

我的一些代碼在x64中失敗了,我開始挖掘,這是由於一些通過Runtime.getRuntime()調用本地東西的代碼。 EXEC()...System.getProperty(「os.name」)在最新的Windows操作系統中返回什麼

但這種代碼可能有些久遠,但它沒有考慮到新的操作系統,以及一些代碼看起來是這樣的:

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所以不擔心一些傢伙提到的錯誤。

+0

您可能對此問題感興趣:http://stackoverflow.com/questions/1803075/crowdsourcing-a-complete-list-of-common-java-system-properties-and-known-values不幸的是,我避難沒有時間發佈我的發現作爲一個合適的開源項目雖然:( – sfussenegger

+1

這不是一個答案,但這就是爲什麼你總是應該*有一個默認情況。 –

+0

對C. Ross來說,還有一個聲明,但無論如何它失敗了,因爲它默認認爲它的一個linux – Persimmonium

回答

5

最有可能的,你可以修改代碼,說

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

我會測試這個的一個小變化: if(osName.equals(「Windows 95」)...){// w95 etc } else if(osName.contains(「Windows」)){// nt and new ones} else {// unix} – Persimmonium

2

沒有名單,但在Windows7中,有JDK6_u18:

os.name = 「Windows 7的」

注:有一個bug on JFK6_u14 and before,它顯示:

「的Windows Vista」,而不是「Windows 7」(即使操作系統實際上是「Windows 7」),所以要小心!

根據this HowTo,W2003應該是「Windows 2003」。

2

在新的版本應該要求需要什麼樣的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

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

所以只要你使用JDK的較新版本中,它應該返回窗口:依賴於Java的你正在運行的版本,我碰到這個bug來s 7蠻好的。

雖然不確定Windows Server 2008,但我猜測Windows Server 2008

這裏有一個相當完整的列表:

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

+0

bug_id = 6819886 ...我剛剛提到3分鐘前;) – VonC

+2

*嘆*如果只有我加了我的回答3分鐘前,而不是尋找一個窮人的價值觀的完整列表... – Jon

+0

謝謝瓊,讚賞。我已經看到了這個列表,因爲你看到較新的操作系統丟失了...... – Persimmonium

5

我處理這個賽門鐵克在視覺咖啡館還活着..我不建議這樣做。問題是不同的供應商可以提供不同的字符串。我會建議使用操作系統特定的方式來確定平臺。

您可以在Windows上使用「ver」實用程序,在Unix類型系統上使用「uname」。

在Windows上使用「GetNativeSystemInfo」可能會更好,但這需要本機代碼。

我建議這種方式而不是依靠System.getProperty方法的原因是因爲您只需要處理底層操作系統而不是坐在操作系統之上的JVM,並且可以消除不同虛擬機的問題爲同一平臺報告不同的事情。

編輯: 很明顯,你將不得不嘗試不同的方式獲取信息,因爲其中一些可能需要運行shell而不是命令。但如果你堅持bash,它應該是好的。基本上嘗試運行命令,直到其中一個工程...不漂亮,但它會工作。

+2

我們只支持Sun jvm,所以這對我們來說不是問題,但我看到你指向... – Persimmonium

4

儘管這不是一個完整的解決方案,但您可以獲得32位JDK並運行帶有不同兼容性設置的簡單代碼os.nameos.version

我這裏還有不同的JDK上的Windows 8.1中報告的os.name/os.version值:

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

此代碼會給你喜歡最新的Windows操作系統命名爲 「Windows服務器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; 
    } 
相關問題