>我正在尝试使用子进程运行基本的cmd命令,我正在使用nodejs测试一些cli,但不明白为什么我没有得到任何输出,这里有一个简单的例子:
const spawn = require('child_process').spawn
let child = spawn('cmd.exe',['/K'])
child.stdout.setEncoding('utf8');
child.stdout.on('data', (data) => {
console.log(data.toString())
});
child.stdin.write('heroku loginn');
输出应为:
heroku:
Enter your login credentials
Email :
我错过了什么?感谢
更新:
我一直在玩代码,可以得到我想要的:
const spawn = require('child_process').spawn
let child = spawn('heroku',['login' ,'-i']);
child.stderr.on('data', function(data) {
child.stdin.write('email@hotmail.com');
});
一旦stderr.on被解雇,我必须输入电子邮件地址 但是在我打电话给child.stdin.write('email@hotmail.com');
后,我收到一个错误:
'sh' is not recognized as an internal or external command,
operable program or batch file.
任何人都可以让我知道此错误的原因是什么?
我找不到任何可以解决它的东西,但通过在线研究,我发现 node-pty (https://github.com/microsoft/node-pty( 可以完成这项工作,对于 Windows,您必须安装一些额外的应用程序,但适用于我测试的大多数 CLI,这里有一个简单的例子:
var os = require('os');
var pty = require('node-pty');
var shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';
var ptyProcess = pty.spawn(shell, ['heroku login -i'], {
name: 'heroku',
cwd: process.env.HOME,
env: process.env
});
ptyProcess.write('my@email.comr');
ptyProcess.write('passwordr');
ptyProcess.on('data', function(data) {
ptyProcess.write('n');
process.stdout.write(data);
});
这是另一个:
var os = require('os');
var pty = require('node-pty');
var shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';
var ptyProcess = pty.spawn(shell, ['vue create app'], {
name: 'vue',
cwd: process.env.HOME,
env: process.env
});
ptyProcess.write('keydown');
ptyProcess.on('data', function(data) {
process.stdout.write(data.toString().trim());
});