Jak ustalić bieżący system operacyjny za pomocą Node.js


273

Piszę kilka skryptów powłoki węzła do użycia podczas programowania na platformie. Mamy zarówno programistów Mac, jak i Windows. Czy istnieje zmienna, którą mogę sprawdzić w węźle, aby uruchomić plik .sh w jednej instancji, a .bat w innej?


Jak połączenie modułu procesów potomnych z modułem systemu operacyjnego ?
Wolfgang Kuehn


Odpowiedzi:


482

Zmienna do użycia to process.platform

Na Macu zmienna zwraca darwin. W systemie Windows zwraca win32(nawet w wersji 64-bitowej).

Aktualne możliwe wartości to:

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

Właśnie ustawiłem to na górze mojego jakeFile:

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

4
Powinieneś lepiej korzystać z modułu systemu operacyjnego, nawet w dokumentacji. konkretnie platforma os.pl
alessioalex,

92
Windows zwraca 'win32', nawet w 64-bitowych systemach operacyjnych. tj. process.platform === 'win32'jest wystarczający
Raynos

15
Sprawdziłem os.platform i process.platform i są one dokładnie takie same na Windows i Mac. Będę korzystać z process.platform, ponieważ nie wymaga to dołączenia biblioteki lib.
Mauvis Ledford

10
Podczas gdy porównanie ciągów process.platform === 'win32'wydaje się bardziej zwięzłe niż wyrażenie regularne i oczywiście szybsze. Wyrażenie regularne, które opublikował Mauvis, wydaje się być lepszą kontrolą jakości . Jeśli Node / Windows każdy zdecyduje się zwrócić win64, winARM itp., Lub cokolwiek innego, tona kodu zepsuje się przy porównywaniu ciągów. Szukamy tylko tego, czy jest to Windows, czy nie. Nie łuk. Głosuję teraz na regex po tym, jak po pewnym czasie użyłem porównania ciągów, regex „wydaje się” bezpieczniejszy.
Andrew T Finnell,

8
@AndrewTFinnell: Win32 nie oznacza w rzeczywistości „Windows na x86” - Windows na x64, ARM, a nawet Itanium to wszystkie Win32, ponieważ Win32 to nazwa API bez względu na procesor na którym działa. Architektura nie ma więc nic wspólnego z nazwą Win32. Twierdziłbym, że sprawdzenie wyrażenia regularnego jest bardziej niebezpieczne, ponieważ niektóre inne niekompatybilne platformy mogą zacząć od znaków „wygrać” w pewnym momencie w przyszłości.
Dietrich Epp,

52

W Node.js v6 (i nowszych wersjach) istnieje dedykowany osmoduł, który zapewnia szereg metod narzędziowych związanych z systemem operacyjnym.

Na moim komputerze z systemem Windows 10 zgłasza:

var os = require('os');

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

Możesz przeczytać pełną dokumentację tutaj: https://nodejs.org/api/os.html#os_os_type


2
Działa to, ale tylko do wykonania kodu po stronie serwera, nie zapewnia platformy kodu klienta. Tylko platforma serwera wykonująca kod. Wypróbowałem to z BrowserStack i daje to tylko system operacyjny instancji Docker Container, który jest systemem uruchamiającym, a nie instancję przeglądarki działającą na BrowserStack, która może być iOS lub Android, Windows lub OSX.
Seth Eden,

link do strony nie istnieje. Czy możesz zaktualizować link?
Srishti Sinha

49

Szukasz macierzystego modułu systemu operacyjnego dla Node.js:

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

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

os.platform ()

Zwraca platformę systemu operacyjnego. Możliwe wartości to „darwin”, „freebsd”, „linux”, „sunos” lub „win32”. Zwraca wartość process.platform.


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

6
process.platform również działa bez potrzeby: nodejs.org/dist/latest-v4.x/docs/api/…
David Braun

Ponownie dodaj openbsd do listy
Jam Risser

os.platform () podaje wyjściową „przeglądarkę” zamiast nazwy systemu operacyjnego.
Mohd Shahid

16

Proces

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
Nie ma platformy o nazwie „win64” . Dostępne wartości można znaleźć tutaj: nodejs.org/api/process.html#process_process_platform Również zapomniałeś zamknąć swoją ostatnią , jeśli .
frzsombor

os.type()wydaje się, że zwraca „Darwin” z wielką literą. Ze względów bezpieczeństwa lepiej byłoby zadzwonić os.type().toLowerCase()przed porównaniem wartości.
cwouter

6

To działa dobrze dla mnie

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

gdy używasz 32-bitowego węzła w 64-bitowych oknach (takich jak deweloper-węzeł webkit lub atom-shell), platforma process.platform wyśle ​​echo win32

posługiwać się

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

(sprawdź tutaj po szczegóły)


4

Działa dobrze dla mnie

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

Modyfikator i służy do dopasowania bez rozróżniania wielkości liter.


2
const path = require('path');

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

5
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Badacadabra

Mimo że działałoby to w większości przypadków, wolałbym używać osmodułu, który jest bardziej ekspresyjny podczas czytania kodu.
Stephan


0

Napotkałem ten sam problem z uruchomieniem mojego kodu js węzła na maszynie wirtualnej z systemem Windows na komputerze Mac. Poniższy kod załatwił sprawę.

Zastąpić

process.platform == 'win32'

z

const os = wymagany („os”);

os.platform () == 'win32';

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.