gpt4 book ai didi

javascript - 如果 exec 一个 exe,Node JS exec 不会回调

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:49 24 4
gpt4 key购买 nike

我在启动 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 来打开!

我该如何解决这个问题?

最佳答案

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

关于javascript - 如果 exec 一个 exe,Node JS exec 不会回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31727684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com