问题描述
我在启动EXE的Node JS应用程序中具有以下exec命令:
var exec = require('child_process').exec;
var theApp = 'HelloWorld';
var theCommand = 'C:/Program Files/' + theApp + '/dist/' + theApp + '-win32/' + theApp + '.exe';
exec(theCommand, function(error, stdout, stderr) {
    console.log('command callback');
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});
 
   
     EXE可以很好地启动,但是在exec命令中不会触发任何控制台日志,因此好像调用exe不会导致触发回调。 
     如果我执行另一个Node应用程序,例如node app.js那么它将触发回调! 
     这是因为我要打开一个EXE! 
我该如何解决?
1楼 
  
    jfriend00 
    5 
   已采纳 
    2015-07-30 17:39:59
  
 
 当您正在运行的程序启动并没有终止时,您将不会获得任何回调或事件,直到该程序最终退出。 系统只是没有为该条件定义任何类型的事件。 子进程正在运行或没有运行。 有关其状况的任何进一步详细信息,您都应该以某种方式与它进行通信(stdin,stdout,stderr,将套接字连接到它,询问系统中的进程等)。
 
     由于该程序实际上可以执行任何操作,因此您从外面可以知道的是它是错误退出还是没有错误退出还是看上去仍在运行。 
     exec()调用的返回值包含一个进程ID,因此,如果您想特别了解某些信息,您还可以查询有关该进程ID的一些信息。 
这是您可以做什么的示例:
var exec = require('child_process').exec;
var theCommand = "notepad sample.txt";
function runit(cmd, timeout) {
    return new Promise(function(resolve, reject) {
        var ch = exec(theCommand, function(error, stdout, stderr) {
            if (error) {
                reject(error);
            } else {
                resolve("program exited without an error");
            }
        });
        setTimeout(function() {
            resolve("program still running");
        }, timeout);
    });
}
runit(theCommand, 1000).then(function(data) {
    console.log("success: ", data);
}, function(err) {
    console.log("fail: ", err);
});
 
   
     我不清楚,如果正在运行的程序迅速退出,但希望没有错误(代码中第一次调用resolve() ,您希望它以哪种方式起作用。 
     您可以根据所需的行为将其更改为reject() 。 
     我以为没有错误的退出不是错误,但是您的情况可能有所不同。 
 
     注意:如果您实际上不是在等待其他程序的完成,则可能不希望使用.exec()因为这是它构建的一部分。 
     您可能要使用其他子进程创建方法之一。