我正在运行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()会向程序发送一个命令,就好像用户在控制台中键入它一样.但是,由于该程序没有响应,我认为情况并非如此.如何发送程序输入?
我见过很多类似的问题,但不幸的是,他们的作者报告称"工作"的解决方案并不适用于我.
我已经看到了这个问题和答案,并尝试了其中的所有内容但没有成功.我试过用\r\n而不是结束命令\n.我也尝试过child.stdin.end()写完后添加这一行.这些都没有奏效.
这个人在他们的自我回答中说,他们的工作几乎与我一样,但是我的工作不起作用.
Nodejs Child Process:从已经初始化的进程写入stdin
这个人在他们的自我回答中说,他们通过将他们的输入写入文件然后将该文件传递给他们来使其工作stdin.发送一个简单的字符串听起来过于复杂.
小智 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)
| 归档时间: |
|
| 查看次数: |
3024 次 |
| 最近记录: |