Comment déterminer le système d'exploitation actuel avec Node.js


273

J'écris quelques scripts de shell de noeud à utiliser lors du développement sur une plate-forme. Nous avons des développeurs Mac et Windows. Existe-t-il une variable que je peux rechercher dans Node pour exécuter un fichier .sh dans une instance et .bat dans une autre?


Vous aimez combiner le module Processus enfants avec le module OS ?
— Wolfgang Kuehn

Cela ressemble à un doublon de stackoverflow.com/questions/6551006/…
— Waylon Flinn

Réponses:


482

La variable à utiliser serait process.platform

Sur Mac, la variable revient darwin. Sous Windows, il revient win32(même sur 64 bits).

Les valeurs actuelles possibles sont:

  • aix
  • darwin
  • freebsd
  • linux
  • openbsd
  • sunos
  • win32

Je viens de mettre cela en haut de mon jakeFile:

var isWin = process.platform === "win32";

4
Vous devriez mieux utiliser le module OS, c'est même dans la documentation. os.platform spécifiquement
— alessioalex

92
Windows revient 'win32', même sur les systèmes d'exploitation 64 bits. c'est-à process.platform === 'win32'- dire est suffisant
— Raynos

15
J'ai vérifié os.platform et process.platform et ce sont exactement les mêmes sur Windows et Mac. J'utiliserai process.platform car il ne nécessite pas d'inclure une lib.
— Mauvis Ledford

10
Alors que la comparaison de chaînes process.platform === 'win32'semble plus concise que l'expression régulière, et évidemment plus rapide. Le regex Mauvis a posté semble être un meilleur contrôle de qualité . Si Node / Windows décidait de renvoyer win64, winARM, etc., ou quoi que ce soit d'autre, une tonne de code romprait avec la chaîne de comparaison. Tout ce que nous recherchons, c'est si c'est Windows ou non. Pas l'arc. Je vote pour le regex à ce moment après avoir utilisé la comparaison de chaîne pendant un certain temps, le regex «se sent» plus en sécurité.
— Andrew T Finnell

8
@AndrewTFinnell: Win32 ne signifie pas réellement «Windows sur x86» - Windows sur x64, ARM ou même Itanium sont tous Win32, car Win32 est le nom de l'API quel que soit le processeur sur lequel il s'exécute. L'architecture n'a donc rien à voir avec le nom Win32. Je dirais que la vérification des expressions rationnelles est plus dangereuse, car une autre plate-forme incompatible pourrait éventuellement commencer avec les personnages "gagner" à un moment donné dans le futur.
— Dietrich Epp le

53

Avec Node.js v6 (et supérieur), il existe un osmodule dédié , qui fournit un certain nombre de méthodes utilitaires liées au système d'exploitation.

Sur ma machine Windows 10, il signale les éléments suivants:

var os = require('os');

console.log(os.type()); // "Windows_NT"
console.log(os.release()); // "10.0.14393"
console.log(os.platform()); // "win32"

Vous pouvez lire sa documentation complète ici: https://nodejs.org/api/os.html#os_os_type


2
Cela fonctionne, mais uniquement pour l'exécution de code côté serveur, cela ne donne pas la plate-forme du code client. Seule la plateforme du serveur exécutant le code. Je l'ai essayé avec BrowserStack et cela ne donne que le système d'exploitation de l'instance Docker Container qui est le coureur, pas l'instance de navigateur fonctionnant sur BrowserStack, qui pourrait être iOS ou Android, ou Windows ou OSX.
— Seth Eden du

le lien vers la page n'existe pas. Pouvez-vous mettre à jour le lien?
— Srishti Sinha

49

Vous recherchez le module natif du système d'exploitation pour Node.js:

v4: https://nodejs.org/dist/latest-v4.x/docs/api/os.html#os_os_platform

ou v5: https://nodejs.org/dist/latest-v5.x/docs/api/os.html#os_os_platform

os.platform ()

Renvoie la plate-forme du système d'exploitation. Les valeurs possibles sont 'darwin', 'freebsd', 'linux', 'sunos' ou 'win32'. Renvoie la valeur de process.platform.


9
var isWin = (os.platform () === 'win32');
— urish

6
process.platform fonctionne aussi, sans besoin: nodejs.org/dist/latest-v4.x/docs/api/…
— David Braun

Encore une fois, ajoutez openbsd à la liste
— Jam Risser

os.platform () donne la sortie "browser" au lieu de donner le nom os.
— Mohd Shahid

16

Processus

var opsys = process.platform;
if (opsys == "darwin") {
    opsys = "MacOS";
} else if (opsys == "win32" || opsys == "win64") {
    opsys = "Windows";
} else if (opsys == "linux") {
    opsys = "Linux";
}
console.log(opsys) // I don't know what linux is.

OS

const os = require("os"); // Comes with node.js
console.log(os.type());

4
Il n'y a pas de plate-forme appelée "win64" . Vous pouvez trouver les valeurs disponibles ici: nodejs.org/api/process.html#process_process_platform De plus, vous avez oublié de fermer votre dernier if si .
— frzsombor

os.type()semble retourner "Darwin" avec une majuscule. Pour des raisons de sécurité, il peut être préférable d'appeler os.type().toLowerCase()avant de comparer les valeurs.
— cwouter

6

Cela fonctionne bien pour moi

var osvar = process.platform;

if (osvar == 'darwin') {
    console.log("you are on a mac os");
}else if(osvar == 'win32'){
    console.log("you are on a windows os")
}else{
    console.log("unknown os")
}

4

lorsque vous utilisez un nœud 32bits sur des fenêtres 64bits (comme les développeurs node-webkit ou atom-shell), process.platform fera écho à win32

utilisation

    function isOSWin64() {
      return process.arch === 'x64' || process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432');
    }

(vérifiez ici pour plus de détails)


4

Fonctionne bien pour moi

if (/^win/i.test(process.platform)) {
    // TODO: Windows
} else {
    // TODO: Linux, Mac or something else
}

Le modificateur i est utilisé pour effectuer une correspondance insensible à la casse.


2
const path = require('path');

if (path.sep === "\\") {
console.log("Windows");
} else {
console.log("Not Windows");
}

5
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la manière et / ou la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
— Badacadabra

Même si cela fonctionnerait dans la plupart des cas, je préférerais utiliser le osmodule, qui est plus expressif lors de la lecture du code.
— Stephan

1
var isWin64 = process.env.hasOwnProperty('ProgramFiles(x86)');

0

J'étais confronté au même problème lors de l'exécution de mon code de nœud js sur Windows VM sur une machine mac. Le code suivant a fait l'affaire.

Remplacer

process.platform == 'win32'

avec

const os = require ('os');

os.platform () == 'win32';

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.