2015-08-09 17 views
38

W Javie widzimy wartość właściwości os.name, aby poznać nazwę bazowego systemu operacyjnego: System.getProperty("os.name").Java "os.name" dla systemu Windows 10?

Dla każdej wersji systemu Windows, kiedyś powrócić zawsze dokładną nazwę systemu operacyjnego: Windows XP dla XP, Vista, Windows Vista dla Windows 7 przez siedem, Windows 8.1 8,1, i tak dalej ...

Problem jest: właśnie aktualizowane mój Windows 8.1 do Windows 10 za pomocą wydany Microsoft updater, i wydaje się, że ta właściwość pozostaje Windows 8.1:

public class OSTest { 
    public static void main(String[] args) { 
    System.out.println(System.getProperty("os.name")); 
    } 
} 

Jak mogę utworzyć obejście tego? Czy ktokolwiek wie, czy problem ten utrzymuje się po zainstalowaniu nowej kopii systemu Windows 10 - to znaczy, że ten błąd jest spowodowany przez automatyczny aktualizator firmy Microsoft?

+1

Której wersji Java używasz tego (nie mam pojęcia, jak to naprawić, poza oczekiwaniem na aktualizację/poprawkę Java lub Windows)? –

+0

Używam JDK 1.8.0_40 – BloodShura

+1

Czy uruchomiłeś ponownie? Jaki jest wynik ['ver'] (https://en.wikipedia.org/wiki/Ver_%28command%29) w wierszu poleceń? –

Odpowiedz

35

Jest to znany problem JDK-8066504 że został naprawiony w nadchodzącej aktualizacji Java 8 60.

Powodem jest GetVersionEx funkcja zmieniła swoje zachowanie od Windows 8.1.

Istnieje wiele możliwych obejść, patrz MSDN article.

Ten trywialny to exec cmd.exe /c ver.

Drugim jest sprawdzenie informacji o wersji jednego z plików systemowych, np. kernel32.dll.

11

Jest to zdecydowanie znany błąd. Dzieje się tak, ponieważ właściwość os.name otrzymuje wartość z GetVersionEx w kodzie źródłowym interfejsu API systemu Windows. GetVersionEx jednak

mogą być zmienione lub niedostępne dla wydań po Windows 8.1

Jak na oficjalnej stronie Microsoftu. Zamiast tego będziemy musieli użyć funkcji IsWindows10OrGreater znalezionej w funkcjach API Pomocnika wersji w pliku versionhelpers.h. Jak się pewnie domyślacie, ten plik nie jest plikiem Java, ale jest napisany w C. W rezultacie musimy włączyć go w nieco okrężny sposób. To zajmuje sporo pracy (musisz zaprogramować w JNI: /), ale pomoże ci to this tutorial. Inne rozwiązanie jest pokazane w this bug log i wymaga mniejszego wysiłku.

-12

Można również użyć metody .contains() i po prostu sprawdzić na „Windows” ciąg może wzdłuż linii

if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains(windows version here [xp, 7, 8, etc]))){} 

Jeśli potrzebujesz wersji systemu Windows można sprawdzić dla wszystkich wersji, a następnie zakładamy 8.1 lub 10, aby obejść błąd.

if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("xp")){ 
//code for windows xp } 

else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("vista")){ 
//code for windows vista 

else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("7")){ 
//code for windows 7} 

else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("8")){ 
//code for windows 8} 
else if (System.getProperty("os.name").toLowerCase().contains("windows") && System.getProperty("os.name").toLowerCase().contains("8.1")){ 
//code for both windows 8.1 and 10 

} 

teraz wyjaśnić, co się dzieje tutaj:

  1. if jest tylko warunkowy do określenia wersji systemu Windows

  2. System.getProperty("os.name") zwraca nazwę systemu operacyjnego jako ciąg

  3. Metoda .toLowerCase() powoduje, że zwracana jest mała litera ciągu

  4. The .contains(String) kontroli metodę, jeśli dany ciąg wejściowy jest zawarty w łańcuchu jest on wezwał

  5. ostatniego sprawozdania pozwala na inny kod dla każdego systemu operacyjnego, z wyjątkiem 8.1 & 10, które muszą być traktowane jako jeden blok: (

+3

"Ostatnia instrukcja dopuszcza inny kod dla każdego OS oprócz 8.1 i 10". To jest dokładnie to, czego OP NIE chce. Tak więc ta odpowiedź dosłownie robi wszystko, ALE odpowiedź na pytanie. – HyperNeutrino

Powiązane problemy