Wie bestimme ich das aktuelle Betriebssystem mit Node.js.


273

Ich schreibe ein paar Node-Shell-Skripte für die Entwicklung auf einer Plattform. Wir haben sowohl Mac- als auch Windows-Entwickler. Gibt es eine Variable, nach der ich in Node suchen kann, um eine .sh-Datei in einer Instanz und .bat in einer anderen auszuführen?


Möchten Sie das Modul Child Processes mit dem Modul OS kombinieren ?
Wolfgang Kuehn

Dies sieht aus wie ein Duplikat von stackoverflow.com/questions/6551006/…
Waylon Flinn

Antworten:


482

Die zu verwendende Variable wäre process.platform

Auf dem Mac wird die Variable zurückgegeben darwin. Unter Windows wird es zurückgegeben win32(auch unter 64 Bit).

Derzeit mögliche Werte sind:

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

Ich habe dies einfach oben in meine jakeFile gesetzt:

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

4
Sie sollten das Betriebssystemmodul besser verwenden, es steht sogar in der Dokumentation. os.platform speziell
alessioalex

92
Windows kehrt 'win32'auch auf 64-Bit-Betriebssystemen zurück. dh process.platform === 'win32'ist ausreichend
Raynos

15
Ich habe os.platform und process.platform überprüft und sie sind auf Windows und Mac genau gleich. Ich werde process.platform verwenden, da keine lib erforderlich ist.
Mauvis Ledford

10
Während der String-Vergleich von process.platform === 'win32'prägnanter als der Regex und offensichtlich schneller erscheint. Der Regex, den Mauvis veröffentlicht hat, scheint eine bessere Qualitätsprüfung zu sein . Wenn sich Node / Windows dazu entschließen, win64, winARM usw. oder irgendetwas anderes zurückzugeben, würde eine Menge Code mit dem String-Vergleich brechen. Wir suchen nur, ob es Windows ist oder nicht. Nicht der Bogen. Ich stimme zu diesem Zeitpunkt für den regulären Ausdruck, nachdem ich den String-Vergleich für eine Weile verwendet habe. Der reguläre Ausdruck fühlt sich sicherer an.
Andrew T Finnell

8
@AndrewTFinnell: Win32 bedeutet eigentlich nicht "Windows unter x86" - Windows unter x64, ARM oder sogar Itanium sind alle Win32, da Win32 der Name der API ist, unabhängig davon, auf welchem ​​Prozessor es ausgeführt wird. Die Architektur hat also nichts mit dem Namen Win32 zu tun. Ich würde argumentieren, dass der Regex-Check gefährlicher ist, da eine andere, inkompatible Plattform möglicherweise irgendwann in der Zukunft mit den Charakteren "win" beginnt.
Dietrich Epp

52

Mit Node.js v6 (und höher) gibt es ein dediziertes osModul, das eine Reihe betriebssystembezogener Dienstprogrammmethoden bereitstellt.

Auf meinem Windows 10-Computer wird Folgendes gemeldet:

var os = require('os');

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

Die vollständige Dokumentation finden Sie hier: https://nodejs.org/api/os.html#os_os_type


2
Dies funktioniert, aber nur für die Ausführung von serverseitigem Code gibt es nicht die Plattform des Client-Codes. Nur die Plattform des Servers, der den Code ausführt. Ich habe es mit BrowserStack versucht und es gibt nur das Betriebssystem der Docker Container-Instanz an, die der Runner ist, nicht die auf BrowserStack ausgeführte Browser-Instanz, die iOS oder Android oder Windows oder OSX sein kann.
Seth Eden

Der Link zur Seite existiert nicht. Können Sie bitte den Link aktualisieren?
Srishti Sinha

49

Sie suchen nach dem nativen Betriebssystemmodul für Node.js:

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

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

os.platform ()

Gibt die Betriebssystemplattform zurück. Mögliche Werte sind 'darwin', 'freebsd', 'linux', 'sunos' oder 'win32'. Gibt den Wert von process.platform zurück.


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

6
process.platform funktioniert auch ohne eine Anforderung
David Braun

Fügen Sie wieder openbsd zur Liste hinzu
Jam Risser

os.platform () gibt die Ausgabe "Browser" aus, anstatt den Namen des Betriebssystems anzugeben.
Mohd Shahid

16

Prozess

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.

Betriebssystem

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

4
Es gibt keine Plattform namens "win64" . Die verfügbaren Werte finden Sie hier: nodejs.org/api/process.html#process_process_platform Außerdem haben Sie vergessen, Ihr letztes anderes zu schließen, wenn .
Frzsombor

os.type()scheint 'Darwin' mit einem Großbuchstaben zurückzugeben. Aus Sicherheitsgründen ist es möglicherweise besser, os.type().toLowerCase()vor dem Vergleichen der Werte anzurufen .
Cwouter

6

Das funktioniert gut für mich

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

Wenn Sie einen 32-Bit-Knoten in 64-Bit-Fenstern verwenden (z. B. Node-Webkit- oder Atom-Shell-Entwickler), gibt process.platform win32 wieder

verwenden

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

(siehe hier für Details)


4

Funktioniert gut für mich

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

Der Modifikator i wird verwendet, um einen Matching ohne Berücksichtigung der Groß- und Kleinschreibung durchzuführen.


2
const path = require('path');

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

5
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
Badacadabra

Obwohl dies in den meisten Fällen funktionieren würde, würde ich es vorziehen, das osModul zu verwenden, das beim Lesen des Codes aussagekräftiger ist.
Stephan

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

0

Ich hatte das gleiche Problem beim Ausführen meines Knoten-JS-Codes auf einer Windows-VM auf einem Mac. Der folgende Code hat den Trick gemacht.

Ersetzen

process.platform == 'win32'

mit

const os = require ('os');

os.platform () == 'win32';

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.