如何使用Node.js确定当前操作系统


273

我正在编写几个节点外壳脚本,供在平台上开发时使用。我们有Mac和Windows开发人员。是否可以在Node中检查变量以在一个实例中运行.sh文件,在另一个实例中运行.bat?


像将模块子进程与模块OS结合在一起?
Wolfgang Kuehn


Answers:


482

使用的变量是 process.platform

在Mac上,变量返回darwin。在Windows上,它返回win32(甚至在64位上)。

当前可能的值为

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

我只是将其设置在我的jakeFile的顶部:

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

4
您应该更好地使用OS模块,甚至在文档中也是如此。特别是os.platform
alessioalex 2011年

92
Windows返回'win32',即使在64位操作系统上也是如此。即process.platform === 'win32'足够
Raynos 2011年

15
我检查了os.platform和process.platform,它们在window和mac上完全相同。我将使用process.platform,因为它不需要包含lib。
Mauvis Ledford 2012年

10
虽然字符串的比喻process.platform === 'win32'似乎比正则表达式更简洁,但显然更快。正则表达式Mauvis发布似乎是更好的质量检查。如果Node / Windows每个都决定返回win64,winARM等,则字符串比较会破坏大量代码。我们所寻找的只是是否使用Windows。不是拱门。在使用字符串比较一段时间后,我此时投票给正则表达式,正则表达式“感觉”更安全。
Andrew T Finnell

8
@AndrewTFinnell:Win32实际上并不表示“ x86上的Windows” — x64,ARM甚至Itanium上的Windows都是Win32,因为Win32是API的名称,而不管它在什么处理器上运行。因此,该体系结构与Win32名称无关。我认为正则表达式检查更为危险,因为在将来的某个时候,可能会想到一些其他不兼容的平台以字符“ win”开始。
Dietrich Epp

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容器实例的操作系统,而不提供在BrowserStack上运行的浏览器实例,后者可能是iOS或Android,也可能是Windows或OSX。
赛斯·伊甸园

该页面的链接不存在。您能否更新链接?
Srishti Sinha

49

您正在寻找Node.js的OS本机模块:

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 '18

os.platform()给出输出“浏览器”,而不是给出os名称。
Mohd Shahid

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另外,您还忘记了关闭其他if
frzsombor

os.type()似乎以大写形式返回“ Darwin”。出于安全原因,最好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

当您在64位Windows上使用32位节点(例如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
尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
Badacadabra

即使这在大多数情况下都可行,我还是更喜欢使用os模块,该模块在阅读代码时更具表现力。
斯蒂芬

1
var isWin64 = process.env.hasOwnProperty('ProgramFiles(x86)');

0

我在Mac机的Windows VM上运行我的节点js代码时遇到相同的问题。下面的代码可以达到目的。

更换

process.platform =='win32'

const os = require('os');

os.platform()=='win32';

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.