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

407

我正在编写一些Node脚本,用于平台开发。我们有Mac和Windows的开发者。在Node中是否有一个变量可以检查,在一个实例中运行.sh文件,而在另一个实例中运行.bat文件?


喜欢将模块_Child Processes_与模块_OS_结合使用吗? - Wolfgang Kuehn
10个回答

731

可以使用的变量是process.platform

在Mac上,该变量设置为darwin。在Windows上,它设置为win32(即使在64位系统上也是如此)。

当前可能的值包括:

  • aix
  • darwin
  • freebsd
  • linux
  • openbsd
  • sunos
  • win32
  • android(根据链接是实验性的)

我只是把这个放在我的jakeFile顶部:

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

9
你应该更好地使用OS模块,它甚至在文档中有提到。具体来说,要使用os.platform。 - alessioalex
121
即使在64位操作系统上,Windows返回"win32"。即process.platform === 'win32'就足够了。 - Raynos
28
我检查了 os.platform 和 process.platform,在 Windows 和 Mac 上它们完全相同。我将使用 process.platform,因为它不需要包含一个 lib。 - Mauvis Ledford
12
虽然process.platform === 'win32'的字符串比较看起来更加简洁,而且显然更快。但是Mauvis发布的正则表达式似乎是更好的质量检查。如果Node/Windows决定返回win64、winARM等任何其他内容,那么大量的代码将因为字符串比较而崩溃。我们只需要知道它是否为Windows。不需要考虑体系结构。在使用字符串比较一段时间后,我投票支持使用正则表达式,因为它“感觉”更安全。 - Andrew T Finnell
18
Win32并不实际意味着“在x86平台上的Windows”,因为无论在x64、ARM或者Itanium上运行,只要使用Win32 API,都可以称之为Win32。因此,架构与Win32名称无关。我认为正则表达式检查更加危险,因为一些其他不兼容的平台未来可能会以“win”字符开头。 - Dietrich Epp
显示剩余7条评论

95

使用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


3
这种方法只适用于服务器端代码执行,无法提供客户端代码的平台信息,仅能提供执行代码的服务器平台信息。我曾在BrowserStack上尝试过,它只会给出Docker容器实例的操作系统信息,而不是运行在BrowserStack上的浏览器实例,可能是iOS或Android,也可能是Windows或OSX。 - Seth Eden

55

11
变量isWin的值等于(os.platform() === 'win32'),其中os.platform()返回当前操作系统平台,如果平台是Windows,则返回true,否则返回false。 - urish
7
process.platform也可以使用,无需require:https://nodejs.org/dist/latest-v4.x/docs/api/process.html#process_process_platform - David Braun
再次将OpenBSD添加到列表中。 - Clay Risser
os.platform()输出“browser”而不是操作系统名称。 - Mohd Shahid

31

处理

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());

18
没有叫做"win64"的平台。您可以在这里找到可用的值:https://nodejs.org/api/process.html#process_process_platform。另外,您忘记关闭上一个 "else if" 了。 - frzsombor
5
os.type()似乎以大写形式返回'Darwin'。出于安全原因,在比较值之前最好调用os.type().toLowerCase()进行转换成小写字母。 - cwouter

8
这对我来说很有效。
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")
}

5

对我来说很好用。

if (/^win/i.test(process.platform)) {
    // TODO: Windows
} else {
    // TODO: Linux, Mac or something else
}
i 修饰符用于执行不区分大小写的匹配。

3
当您在64位Windows上使用32位Node(例如node-webkit或atom-shell开发人员),process.platform将显示win32。
使用:
    function isOSWin64() {
      return process.arch === 'x64' || process.env.hasOwnProperty('PROCESSOR_ARCHITEW6432');
    }

(详情请查看此处


2

我在Mac机器上的Windows虚拟机上运行我的Node.js代码时遇到了同样的问题。以下代码可以解决这个问题。

process.platform == 'win32'

替换为

const os = require('os');

os.platform() == 'win32';


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

1
const path = require('path');

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

6
虽然这段代码可能回答了问题,但提供关于它如何以及/或者为什么解决问题的额外背景信息,可以提高答案的长期价值。 - Badacadabra
尽管在大多数情况下这样做是可行的,但我更喜欢使用os模块,因为在阅读代码时更具表现力。 - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接