web-dev-qa-db-fra.com

que renvoie System.getProperty ("os.name") dans les derniers systèmes d'exploitation Windows

une partie de mon code échouait en x64, je commence à creuser, ce qui est dû à un code qui appelle des choses natives via Runtime.getRuntime (). exec () ...

Mais ce code a probablement quelques années, il ne prend pas en compte les nouveaux systèmes d'exploitation, et une partie du code ressemble à ceci:

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;

Je souhaite résoudre ce problème pour tous les nouveaux systèmes d'exploitation (w2008, Windows 7, ...), mais je n'ai pas accès à un hôte de chaque type et je ne souhaite pas installer dans un VM. Juste pour voir la valeur, quelqu'un connaît-il une liste quelque part? Je n'en ai pas encore trouvé.

EDIT: J'aurais besoin de: Windows 7, Windows 2003, Windows 2008, Windows 2008R2 En outre, je ne suis pas le 1.6u18, donc ne vous inquiétez pas du bogue mentionné par certains types.

20
Persimmonium

Très probablement, vous pourriez changer le code pour dire

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;
}
6
erikkallen

Bien que cette solution ne soit pas complète, vous pouvez vous procurer un JDK 32 bits et exécuter une simple impression de code os.name et os.version avec différents paramètres de compatibilité.

Voici les valeurs de os.name/os.version rapportées par différents JDK sur un Windows 8.1 box:

 ╔═════════════════╤════════════╤════════════╤ ════════════╤═══════════════╤═══════════════╤═════ ═════════════════╤══════════════════════╗ 
 ║ 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 (inconnu) Windows NT (inconnu) 
 ║ │ 4.0 │ 4.10 5.1 6.0 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 1.7 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 
 ═════════╧════════════╧═══════════════╧═══════════ ════╧══════════════════════╧═ ═════════════════════╝ 
6
Bass

Je me suis occupé de cela chez Symantec quand Visual Cafe était encore en vie ... Je ne recommande pas de le faire de cette façon. Le problème est que différents fournisseurs peuvent fournir différentes chaînes. Je suggère d'utiliser un moyen spécifique au système d'exploitation pour déterminer la plate-forme. 

Vous pouvez utiliser l'utilitaire "ver" sous Windows et "uname" sur les systèmes de type Unix.

Il serait peut-être préférable d'utiliser "GetNativeSystemInfo" sous Windows, mais cela nécessiterait du code natif.

La raison pour laquelle je suggère cette méthode plutôt que de s'appuyer sur la méthode System.getProperty est que vous devez alors uniquement traiter le système d'exploitation sous-jacent au lieu de la machine virtuelle située au-dessus du système d'exploitation - et cela élimine le problème suivant: la même plate-forme.

EDIT: Évidemment, vous devrez essayer différentes manières d'obtenir les informations, car certaines d'entre elles peuvent nécessiter l'exécution du shell au lieu de la simple commande. Mais si vous vous en tenez à bash, ça devrait être bien. Essentiellement, essayez d’exécuter des commandes jusqu’à ce que l’une d’entre elles fonctionne ... Ce n’est pas beau, mais ça marche.

5
TofuBeer

Pas de liste, mais sous Windows7, avec un JDK6_u18:

os.name = "Windows 7"

Remarque: il y avait un bogue sur JFK6_u14 et avant , où il affichait:

"Windows Vista" au lieu de "Windows 7" (même si le système d'exploitation était en fait "Windows 7"), alors faites attention!

Selon ce HowTo , il devrait s'agir de "Windows 2003" pour W2003.

2
VonC

Comme les nouvelles versions doivent nécessiter ce que la ligne NT requiert, il peut s'avérer plus judicieux de rechercher les anciennes versions et d'utiliser les paramètres NT au lieu de rechercher les versions les plus récentes, par exemple:

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
Fabian Steeg

Dépend de la version de Java que vous utilisez, je suis tombé sur ce bogue:

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

aussi longtemps que vous utiliserez une dernière version du JDK, il devrait renvoyer Windows 7 tout va bien. 

Je ne sais pas si je suis sûr de Windows Server 2008 Windows Server 2008 .

Il y a une liste assez complète ici:

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

2
Jon

Ce code vous donnera le dernier nom du système d'exploitation Windows comme "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;
    }
0
parag borah