Nodejs下如何模拟终端环境运行特定指令

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

各位大佬,请教一个问题,我想在 nodejs 环境下运行 nvm for windows 的指令,但是在 nvm 最近更新的版本里,发现新增了终端检测代码:

if !isTerminal() {
		alert("NVM for Windows should be run from a terminal such as CMD or PowerShell.", "Terminal Only")
		os.Exit(0)
	}
// Capture any additional arguments
if len(args) > 2 {
	detail = args[2]

@@ -180,6 +185,102 @@ func setNpmMirror(uri string) { saveSettings() }

func isTerminal() bool { fileInfo, err := os.Stdout.Stat() if err != nil { return false } return (fileInfo.Mode() & os.ModeCharDevice) != 0 }

请问我可以绕开这个检测吗


Nodejs下如何模拟终端环境运行特定指令

17 回复

啥时代了, 别再 xxx for Windows 了, 开发还是 on WSL 吧.
除非, 客户部署环境就是 on Windows.

抱歉, 没帮你直接解决问题…


const { spawn } = require(‘child_process’);
let child = spawn(‘nvm’, [‘version’], { stdio: ‘inherit’ });

好的大佬,我今晚试试,感谢回复

场景需要没办法要照顾到 win 的用户

一会试试,感谢大佬回复

你需要做一个 pty 来运行它
但是还是建议绕过它,直接去干它在干的事

大佬 你这个方法是可行的,但我使用 spawn 或者 spawnSync 好像都无法获得执行指令后控制台的输出,这个问题可以解决吗

我不是大佬哈,我也是个菜鸟,好多都是问 AI 的。
根据我的理解,这个输出一旦继承到终端了,就没办法再捕获了。
有个思路不确定可不可行,就是用第三方的工具去劫持终端的输出到一个文件里面,再读取文件的内容,不过这样就很绕了,可以参考下楼上的一些方法~

这是要实现自动化切换 node 版本?

好的好的 我在研究一下 谢谢哈

模拟终端环境就是 pty ,nodejs 下好像有 node-pty 在 windows 下可用
但是似乎有个未解决的 bug [Unable to kill pty process on Windows]( https://github.com/microsoft/node-pty/issues/437) 导致运行完成后 node 不会自动退出

可以试试这个 volta

指令 or 命令?

nvm 不是 nodejs 的版本管理 cli 吗,看你的需要是想在 js 里执行命令,无非就是 child_process 。
- exec 可以指定 shell 环境,cmd 或者 ps 都行,要读输出懒得说了看文档吧
- spawn 直接运行程序,可以无需 shell 。nvm 应该是脚本吧,.sh/.bat 之类的,如果是 c 编译成的.exe 程序倒也可以。spawn 貌似也可以指定 shell ,看文档
- fork 用不多不熟,貌似对 ipc 有用

是的没错,但是因为 nvm 加了终端判断所以试了 exec 指定 cmd 或者 shell 也不行,上面回答的 spawn(‘nvm’, [‘version’], { stdio: ‘inherit’ }); 是可行的

在 Node.js 下模拟终端环境运行特定指令,可以使用内置的 child_process 模块。这个模块提供了生成子进程的方法,能够执行 shell 命令或脚本。

下面是一个简单的示例,展示了如何使用 child_process 模块中的 exec 方法来运行一个特定指令(例如,列出当前目录下的文件):

const { exec } = require('child_process');

// 要执行的命令
const command = 'ls -la';

exec(command, (error, stdout, stderr) => {
  if (error) {
    console.error(`执行命令时出错: ${error}`);
    return;
  }
  if (stderr) {
    console.error(`stderr: ${stderr}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
});

在这个示例中,exec 方法接受两个参数:要执行的命令和一个回调函数。回调函数有三个参数:errorstdoutstderrstdout 包含命令的标准输出,而 stderr 包含标准错误输出。

如果你需要更复杂的交互,比如实时处理输出,可以使用 spawn 方法,它返回一个子进程对象,允许你更细粒度地控制输入和输出流。

例如:

const { spawn } = require('child_process');
const ls = spawn('ls', ['-la']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`子进程退出,退出码 ${code}`);
});

这两个示例展示了如何在 Node.js 下模拟终端环境运行特定指令。

回到顶部