Javascript 节点JS exec不';如果exec是exe,则不会回调
我在启动EXE的Node JS应用程序中有以下exec命令: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) {
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与的区别。