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.