Как определить текущую операционную систему с Node.js


274

Я пишу пару сценариев оболочки для использования при разработке на платформе. У нас есть разработчики как для Mac, так и для Windows. Есть ли переменная, которую я могу проверить в Node для запуска файла .sh в одном экземпляре и .bat в другом?


Как объединить модуль Child Processes с модулем OS ?
— Вольфганг Куен


Ответы:


484

Переменная для использования будет 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, так как он не требует включения библиотеки.
— Mauvis Ledford

10
В то время как сравнение строк process.platform === 'win32'кажется более кратким, чем регулярное выражение, и, очевидно, быстрее. Регулярное выражение, которое опубликовал Mauvis, похоже, является лучшей проверкой качества . Если бы Node / Windows каждый решил вернуть win64, winARM и т. Д. Или что-то еще, тонна кода сломалась бы при сравнении строк. Все, что мы ищем - это Windows или нет. Не арка. Я голосую за регулярное выражение в это время после того, как некоторое время использовал сравнение строк, регулярное выражение чувствует себя более безопасным.
— Эндрю Т Финнелл

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

53

В 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.
— Сет Иден

ссылка на страницу не существует. Можете ли вы обновить ссылку?
— Сришти Синха

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');
— urish

6
Process.platform тоже работает, без необходимости: nodejs.org/dist/latest-v4.x/docs/api/…
— Дэвид Браун

Снова добавьте openbsd в список
— Jam Risser

os.platform () выдает «браузер» вместо того, чтобы давать имя ОС.
— Мохд Шахид,

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 на компьютере Mac. Следующий код добился цели.

замещать

process.platform == 'win32'

с участием

const os = require ('os');

os.platform () == 'win32';

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.