Як визначити поточну операційну систему за допомогою Node.js


273

Я пишу пару скриптів оболонок вузлів для використання під час розробки на платформі. У нас є і розробники Mac, і Windows. Чи є змінна, яку я можу перевірити в Node, щоб запустити .sh файл в одному екземплярі, а .bat в іншому?


Як поєднувати модуль Дочірні процеси з ОС модуля ?
Вольфганг Куен

Це схоже на дублікат stackoverflow.com/questions/6551006/…
Waylon Flinn

Відповіді:


482

Змінна для використання буде process.platform

На Mac змінна повертається darwin. У Windows він повертається win32(навіть на 64 біт).

Поточні можливі значення :

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

Я просто встановив це у верхній частині свого jakeFile:

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

4
Вам слід краще використовувати модуль ОС, це навіть в документації. os.platform конкретно
alessioalex

92
Windows повертається 'win32'навіть на 64-бітних операційних системах. тобто process.platform === 'win32'достатньо
Райнос

15
Я перевірив os.platform та process.platform, і вони точно такі ж у вікні та mac. Я буду використовувати process.platform, оскільки він не вимагає включення lib.
Мавіс Ледфорд

10
Хоча порівняння рядків process.platform === 'win32'здається більш коротким, ніж регулярний вираз, і, очевидно, швидше. Регекс Mauvis розмістив, здається, перевірка на кращу якість . Якщо Node / Windows кожен вирішив повернути win64, winARM тощо, або що-небудь інше, тона коду порушиться зі порівнянням рядків. Все, що ми шукаємо - це Windows чи ні. Не арка. У цей час я голосую за регулярний вимір після того, як деякий час використовував порівняння рядків, регулярний вираз «почувається» безпечнішим.
Ендрю Т Фіннелл

8
@AndrewTFinnell: Win32 насправді не означає "Windows на x86" - Windows на x64, ARM або навіть Itanium - це все Win32, оскільки Win32 - це ім'я API, незалежно від того, на якому процесорі він працює. Тож архітектура не має нічого спільного з назвою Win32. Я заперечую, що перевірка регулярних виразів є більш небезпечною, тому що якась інша, несумісна платформа, можливо, може початися з того, щоб символи «виграли» в якийсь момент майбутнього.
Дітріх Епп

52

З Node.js v6 (і вище) є виділений osмодуль, який надає ряд корисних методів, пов'язаних з операційною системою.

На моїй машині Windows 10 він повідомляє про наступне:

var os = require('os');

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

Повну документацію ви можете прочитати тут: https://nodejs.org/api/os.html#os_os_type


2
Це працює, але тільки для виконання кодового боку сервера він не дає платформу клієнтського коду. Тільки платформа сервера, що виконує код. Я спробував це з BrowserStack, і він дає лише операційну систему екземпляра Docker Container, який є бігуном, а не екземпляр браузера, який працює на BrowserStack, який може бути iOS або Android, або Windows або OSX.
Сет-Едем

посилання на сторінку не існує. Чи можете ви оновити посилання?
Srishti Sinha

49

Ви шукаєте власний модуль ОС для Node.js:

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

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

os.platform ()

Повертає платформу операційної системи. Можливі значення: "darwin", "freebsd", "linux", "sunos" або "win32". Повертає значення process.platform.


9
var isWin = (os.platform () === 'win32');
урви

6
process.platform також працює, не вимагаючи: nodejs.org/dist/latest-v4.x/docs/api/…
Девід Браун

Знову додайте openbsd до списку
Jam Risser

os.platform () дає вихід "браузер" замість того, щоб давати ім'я os.
Мохд-Шахід

16

Процес

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.

ОС

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

4
Немає платформи під назвою "win64" . Ви можете знайти доступні значення тут: nodejs.org/api/process.html#process_process_platform Крім того, ви забули закрити останнє інше, якщо .
frzsombor

os.type()здається, повертає «Дарвін» з великої літери. З міркувань безпеки може бути краще зателефонувати os.type().toLowerCase()перед порівнянням значень.
cwouter

6

Це добре працює для мене

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

коли ви використовуєте 32-бітний вузол у 64-бітових вікнах (як-от розробники node-webkit або atom-shell), process.platform буде лунати win32

використання

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

(перевірте тут деталі)


4

Добре працює для мене

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

Модифікатор i використовується для відповідності нечутливості до регістру.


2
const path = require('path');

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

5
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Бадакадабра

Хоча це спрацювало б у більшості випадків, я вважаю за краще використовувати osмодуль, який є більш виразним при читанні коду.
Стефан


0

Я зіткнувся з тією ж проблемою, запустивши свій код js вузла в Windows VM на комп'ютері Mac. Наступний код зробив свою справу.

Замініть

process.platform == 'win32'

з

const os = вимагати ('os');

os.platform () == 'win32';

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.