55

os.nameJava では、基になるオペレーティング システムの名前を知るために、 のプロパティ値を確認できますSystem.getProperty("os.name")

Windows のエディションごとに、常に OS の正確な名前が返されていました: Windows XPXP の場合Windows Vista、Vista の場合Windows 7、Seven の場合Windows 8.1、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 自動アップデーターが原因であるかどうかを知っている人はいますか?

4

5 に答える 5

50

これは既知の問題であり、今後の Java 8 update 60 で修正されるJDK-8066504です。

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

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

些細なことは execcmd.exe /c verです。

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

于 2015-08-09T23:41:42.790 に答える
17

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

Windows 8.1 以降のリリースでは、変更されているか、使用できない可能性があります。

マイクロソフトの公式サイトによると。IsWindows10OrGreater代わりに、ファイル内のバージョン ヘルパー API 関数にある を使用する必要がありversionhelpers.hます。おそらくご想像のとおり、このファイルは Java ファイルではなく、C で記述されています。そのため、多少回りくどい方法でインクルードする必要があります。かなりの作業が必要ですが (JNI でプログラミングする必要があります :/)、このチュートリアルが役に立ちます。別の解決策がこのバグ ログに示されています。

于 2015-08-09T23:46:38.737 に答える
-23

メソッドを使用して、.contains()おそらく次の行に沿って「windows」文字列を確認することもできます

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

Windows のバージョンが必要な場合は、すべてのバージョンを確認してから、8.1 または 10 を想定してバグを回避できます。

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

}

ここで何が起こっているかを説明します。

  1. if ステートメントは、Windows のバージョンを判断するための単なる条件です。

  2. OSのSystem.getProperty("os.name")名前を文字列として返します。

  3. この.toLowerCase()メソッドは、返された文字列を小文字にします

  4. この.contains(String)メソッドは、指定された入力文字列が呼び出されている文字列に含まれているかどうかを確認します

  5. 最後のステートメントでは、1 つのブロックとして処理する必要がある 8.1 と 10 を除いて、各 OS に異なるコードを使用できます :(

于 2015-08-10T01:56:45.037 に答える