我想使用
child_process.spawn
执行 Windows exe 文件并捕获它的输出。
当我使用命令行运行第三方exe文件时(说
A.exe
),它会将一些日志打印到cmd窗口。像这样:
C:\> A.exe
some outputs...
some more outputs...
但是,当我在node.js中生成它时,使用这个
import childProcess from 'child_process';
const cp = childProcess.spawn('A.exe');
cp.stdout.on('data', data => console.log(`stdout: ${data}`));
cp.stderr.on('data', data => console.log(`stderr: ${data}`));
根本没有任何输出。
我认为
A.exe
的输出不是到标准输出(所以我永远无法通过监听标准输出来获取数据),但我不知道从命令行运行时它如何打印日志。
任何帮助将不胜感激。
在 Unix 类型操作系统(Unix、Linux、macOS)上
child_process.execFile()
可以更高效,因为它不会生成 shell。然而,在 Windows 上,.bat 和 .cmd 文件在没有终端的情况下无法自行执行,因此无法使用 child_process.execFile()
启动。在 Windows 上运行时,可以使用 child_process.spawn() 并使用 child_process.exec()
设置 shell 选项来调用 .bat 和 .cmd 文件,或者通过生成 cmd.exe 并将 .bat 或 .cmd 文件作为参数传递(这就是 shell 选项和 child_process.exec() 所做的)。无论如何,如果脚本文件名包含空格,则需要用引号引起来。
// On Windows Only ...
const { spawn } = require('child_process');
const bat = spawn('cmd.exe', ['/c', 'my.bat']);
bat.stdout.on('data', (data) => {
console.log(data.toString());
});
bat.stderr.on('data', (data) => {
console.log(data.toString());
});
bat.on('exit', (code) => {
console.log(`Child exited with code ${code}`);
});
也许可以尝试一下这种方法:
var childProcess = require('child_process');
childProcess.exec('A.exe', function(error, stdout, stderr) {
if (error != null) {
console.log('error occurred: ' + error);
} else {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
}
});
// OR
var cp = childProcess.spawn('A.exe');
cp.stdout.on('data', (data) => {
console.log('stdout: ' + data.toString());
});
cp.stderr.on('data', (data) => {
console.log('stderr: ' + data.toString());
});
我知道这个问题很老了,但我回答是因为它可以帮助其他人。
我用PyInstaller开发了一个基于Python程序的.exe。 尽管我可以在 .exe 终端上看到打印内容,但我无法获取 .exe 的标准输出。
在每个
stdout.flush()
之后添加 print()
并重建我的 .exe 后,我能够从 Nodejs 上生成的子进程中获取数据。