Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点JS exec不';如果exec是exe,则不会回调_Javascript_Node.js - Fatal编程技术网

Javascript 节点JS exec不';如果exec是exe,则不会回调

Javascript 节点JS exec不';如果exec是exe,则不会回调,javascript,node.js,Javascript,Node.js,我在启动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) {

我在启动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 app.js
,那么它将触发回调!这是因为我正在调用一个EXE来打开


如何解决此问题?

当您运行的程序启动且未终止时,在程序最终退出之前,您将不会收到任何类型的回调或事件。系统只是没有为该条件定义任何类型的事件。子进程是否正在运行。有关其状态的任何详细信息,您都需要以某种方式与它进行通信(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()
,因为这是它构建的一部分。您可能希望使用其他子进程创建方法之一。

说明回调将仅在进程终止后运行。你能确认这里的情况吗?@blgt我不确定,有没有办法确保进程终止?事实上!终止进程不意味着我刚才调用的EXE已经关闭了吗?这不是我想要的。@Cameron好吧,回调只会在进程终止后执行,这意味着应用程序(“exe”)已关闭。我如何运行该命令并在应用程序执行后获得回调?我无法控制其他EXE,因此无法从中触发任何事件以表示它已打开。或者这是不可能的?非常感谢您花时间提供这个答案。我想自己暂停一下。。。但是看起来你有一个更好的实现来处理一些场景。你提到我可以使用另一种创建方法。。。如果我不想等待完成,我可以使用哪一个?Thanks@Cameron-
.spawn()
更常用于长时间运行的进程,因为您可以通过stdout或stderr流获得中间结果,而stdout或stderr流从一开始就可以使用
.spawn()
。您可以阅读一些关于spawn和exec与的区别。