web-dev-qa-db-ja.com

Windows 10用のJavaの「os.name」?

Javaでは、_os.name_のプロパティ値を確認して、基になるオペレーティングシステムの名前System.getProperty("os.name")を知ることができます。

Windowsの各エディションでは、常にOSの正確な名前を返していました。XPでは_Windows XP_、Vistaでは_Windows Vista_、Sevenでは_Windows 7_、8.1では_Windows 8.1_、等々...

問題は、リリースされたMicrosoftアップデーターを使用してWindows 8.1をWindows 10に更新したところです。このプロパティはまだ_Windows 8.1_のままです。

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

これを回避するにはどうすればよいですか?そして、Windows 10の新しいコピーをインストールする場合、つまり、このバグはMicrosoftの自動アップデーターが原因である場合、この問題が解決しないかどうか誰もが知っていますか?

48
BloodShura

これは既知の問題です JDK-8066504 これは今後のJava 8アップデート60で修正されました。

その理由は、 GetVersionEx 関数がWindows 8.1以降でその動作を変更したためです。

考えられる回避策は複数あります。 MSDNの記事 を参照してください。

簡単な方法は、cmd.exe /c verを実行することです。

もう1つは、システムファイルの1つのバージョン情報を調べることです。 kernel32.dll

43
apangin

これは間違いなく既知のバグです。これは、os.nameプロパティがWindows APIのソースコードのGetVersionExから値を取得するために発生します。 GetVersionExただし、

windows 8.1以降のリリースでは変更されたり、利用できなくなる可能性があります

Microsoftの公式Webサイトによる。代わりに、IsWindows10OrGreaterファイルのVersion Helper API関数にあるversionhelpers.hを使用する必要があります。おそらくご想像のとおり、このファイルはJavaファイルではなく、Cで記述されています。そのため、多少の迂回方法で含める必要があります。動作します(JNIでプログラミングする必要があります:/)が、 このチュートリアル が役立ちます。別の解決策が このバグログ に表示され、必要な労力が少なくなります。

13
bpgeck

私は同じ問題に直面し、次の回避策を使用しました:cmdコマンド "systeminfo"は、OSの正しい名前である "OS Name:"を返し、このために次の関数を記述しました。

private boolean os2k10Check()
{
try{

    Process p = Runtime.getRuntime().exec("systeminfo");        /*Execute cmd command "systeminfo"*/
    BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while (true) 
    {
        line = r.readLine();
        if (line == null) { break; }
        if(line.contains("OS Name:"))               /*If output contains OS Name and 2010*/
        {
        if(line.contains("2010"))
                return true;
        else
                return false;       
        }
    }
}
catch(Exception e)
    {System.out.println("Platform Type: os2010check: exception"+e);}

return false;
}
2

うーん...それがWindows 10の修正かどうかわかりません(10.0.17134.590)またはJava 8(1.8.0_171-b11私にとっては)、しかし今は正しい:os.nameは私にWindows 10

また、信頼できない場合は、os.version。私は持っています 10.0

(ところで、私はos.Arch:AMD64。これはOSではなくJVMのものです。 )

0
WesternGun