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