Node.js 子进程无法捕获 Windows exe 文件的输出

问题描述 投票:0回答:3

我想使用

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
的输出不是到标准输出(所以我永远无法通过监听标准输出来获取数据),但我不知道从命令行运行时它如何打印日志。

任何帮助将不胜感激。

node.js windows outputstream child-process spawn
3个回答
1
投票

在 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}`);
});

0
投票

也许可以尝试一下这种方法:

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());
});

0
投票

我知道这个问题很老了,但我回答是因为它可以帮助其他人。

我用PyInstaller开发了一个基于Python程序的.exe。 尽管我可以在 .exe 终端上看到打印内容,但我无法获取 .exe 的标准输出。

在每个

stdout.flush()
之后添加
print()
并重建我的 .exe 后,我能够从 Nodejs 上生成的子进程中获取数据。

© www.soinside.com 2019 - 2024. All rights reserved.