¿Cómo determino el sistema operativo actual con Node.js

273

Estoy escribiendo un par de scripts de shell de nodo para usar cuando desarrolle en una plataforma. Tenemos desarrolladores de Mac y Windows. ¿Hay alguna variable que pueda verificar en Node para ejecutar un archivo .sh en una instancia y .bat en otra?

Mauvis Ledford
fuente
¿Te gusta combinar los procesos secundarios del módulo con el sistema operativo del módulo ?
Wolfgang Kuehn
Esto parece un duplicado de stackoverflow.com/questions/6551006/…
Waylon Flinn

Respuestas:

482

La variable a utilizar sería process.platform

En Mac, la variable regresa darwin. En Windows, regresa win32(incluso en 64 bits).

Los valores posibles actuales son:

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

Acabo de configurar esto en la parte superior de mi archivo jake:

var isWin = process.platform === "win32";
Mauvis Ledford
fuente
44
Debería usar mejor el módulo del sistema operativo, incluso está en la documentación. os.platform específicamente
alessioalex
92
Windows regresa 'win32', incluso en sistemas operativos de 64 bits. process.platform === 'win32'es decir, es suficiente
Raynos
15
Verifiqué os.platform y process.platform y son exactamente iguales en windows y mac. Usaré process.platform ya que no requiere incluir una lib.
Mauvis Ledford
10
Mientras que la comparación de cadenas process.platform === 'win32'parece más concisa que la expresión regular, y obviamente más rápida. La expresión regular que Mauvis ha publicado parece ser un mejor control de calidad . Si Node / Windows decidieran devolver win64, winARM, etc., o cualquier otra cosa, una tonelada de código se rompería con la comparación de cadenas. Todo lo que estamos buscando es si es Windows o no. No el arco. Voto por la expresión regular en este momento después de haber usado la comparación de cadenas por un tiempo, la expresión regular 'se siente' más segura.
Andrew T Finnell
8
@AndrewTFinnell: Win32 en realidad no significa "Windows en x86": Windows en x64, ARM o incluso Itanium son todos Win32, porque Win32 es el nombre de la API independientemente del procesador en el que se esté ejecutando. Entonces la arquitectura no tiene nada que ver con el nombre Win32. Yo diría que la verificación de expresiones regulares es más peligrosa, porque alguna otra plataforma incompatible podría comenzar con los personajes "ganar" en algún momento en el futuro.
Dietrich Epp
53

Con Node.js v6 (y superior) hay un osmódulo dedicado , que proporciona varios métodos de utilidad relacionados con el sistema operativo.

En mi máquina con Windows 10 informa lo siguiente:

var os = require('os');

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

Puede leer su documentación completa aquí: https://nodejs.org/api/os.html#os_os_type

Benny Neugebauer
fuente
2
Esto funciona, pero solo para la ejecución del código del lado del servidor, no proporciona la plataforma del código del cliente. Solo la plataforma del servidor que ejecuta el código. Lo probé con BrowserStack y solo proporciona el sistema operativo de la instancia de Docker Container que es el corredor, no la instancia del navegador que se ejecuta en BrowserStack, que podría ser iOS o Android, o Windows u OSX.
Seth Eden el
el enlace a la página no existe. ¿Pueden actualizar el enlace?
Srishti Sinha
49

Está buscando el módulo nativo del sistema operativo para Node.js:

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

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

os.platform ()

Devuelve la plataforma del sistema operativo. Los valores posibles son 'darwin', 'freebsd', 'linux', 'sunos' o 'win32'. Devuelve el valor de process.platform.

alessioalex
fuente
9
var isWin = (os.platform () === 'win32');
Urish
66
process.platform también funciona, sin necesidad: nodejs.org/dist/latest-v4.x/docs/api/…
David Braun
Nuevamente, agregue openbsd a la lista
Jam Risser
os.platform () proporciona el "navegador" de salida en lugar de dar el nombre del sistema operativo.
Mohd Shahid
16

Proceso

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());
Jaidee
fuente
44
No hay una plataforma llamada "win64" . Puede encontrar los valores disponibles aquí: nodejs.org/api/process.html#process_process_platform Además, olvidó cerrar su última opción si .
frzsombor
os.type()parece devolver 'Darwin' con mayúscula. Por razones de seguridad, podría ser mejor llamar os.type().toLowerCase()antes de comparar valores.
cwouter 01 de
6

Esto funciona bien para mi

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")
}
Adeojo Emmanuel IMM
fuente
4

cuando utiliza un nodo de 32 bits en ventanas de 64 bits (como los desarrolladores de nodo-webkit o atom-shell), process.platform se hará eco de win32

utilizar

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

(marque aquí para más detalles)

usuario2404131
fuente
4

Funciona bien para mi

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

El modificador i se utiliza para realizar coincidencias entre mayúsculas y minúsculas.

Vlad
fuente
2
const path = require('path');

if (path.sep === "\\") {
console.log("Windows");
} else {
console.log("Not Windows");
}
Alexander Koleda
fuente
55
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Badacadabra
Aunque eso funcionaría en la mayoría de los casos, preferiría usar el osmódulo, que es más expresivo al leer el código.
Stephan
1
var isWin64 = process.env.hasOwnProperty('ProgramFiles(x86)');
Ziyu Zhou
fuente
0

Estaba enfrentando el mismo problema al ejecutar mi código de nodo js en Windows VM en la máquina Mac. El siguiente código hizo el truco.

Reemplazar

process.platform == 'win32'

con

const os = require ('os');

os.platform () == 'win32';

Shagun Pruthi
fuente