如何将输入发送到使用spawn创建的子进程?的NodeJS

gfr*_*ng4 8 node.js

我正在运行Windows 10,我有一个程序,我们program可以调用它,可以从命令行运行.运行时,它会响应用户输入的命令.用户输入命令,按返回键,程序打印响应.我没有制作这个程序而且没有源代码,所以我无法修改它.

我想从Node.js中运行这个程序,让我的Node.js程序充当用户,发送命令并获取响应.我生成我的程序,如下所示:

var spawn = require('child_process').spawn;
var child = spawn('program');

child.stdout.on('data', function(data) {
    console.log(`stdout: ${data}`);
});
Run Code Online (Sandbox Code Playgroud)

然后我尝试向它发送命令,例如,help.

child.stdin.write("help\n");
Run Code Online (Sandbox Code Playgroud)

没有任何反应.如果我手动运行程序,键入help,然后按返回键,我得到输出.我希望Node.js运行程序,发送输入,并像人类用户那样接收输出.我假设stdin.write()会向程序发送一个命令,就好像用户在控制台中键入它一样.但是,由于该程序没有响应,我认为情况并非如此.如何发送程序输入?

我见过很多类似的问题,但不幸的是,他们的作者报告称"工作"的解决方案并不适用于我.

小智 2

这对我有用。我曾经child_process exec创建过一个子进程。在这个子进程中Promise,我正在处理给定参数的 i/o 部分cmd。它并不完美,但很有效。

不需要任何人工输入的示例函数调用。

executeCLI("cat ~/index.html");
Run Code Online (Sandbox Code Playgroud)

与 aws cli 交互的示例函数调用。这里

executeCLI("aws configure --profile dev")
Run Code Online (Sandbox Code Playgroud)

自定义函数的代码executeCLI

var { exec } = require('child_process');
async function executeCLI(cmd) {
  console.log("About to execute this: ", cmd);
  var child = exec(cmd);
  return new Promise((resolve, reject) => {
    child.stdout.on('data', (data) => {
      console.log(`${data}`);
      process.stdin.pipe(child.stdin);
    });

    child.on('close', function (err, data) {
      if (err) {
        console.log("Error executing cmd: ", err);
        reject(err);
      } else {
        //   console.log("data:", data)
        resolve(data);
      }
    });
  });
}
Run Code Online (Sandbox Code Playgroud)