child_process 没有从批处理文件返回正确的退出代码

child_process not returning correct exit code from batch file

我试图在 Windows.

上使用 nodejs 从批处理文件中获取正确的退出代码

当从命令行 运行 时,我看到预期的错误代码:

ml.bat profile bootstrap 

ERROR: [".../deploy/lib/RoxyHttp.rb:362:in block in request'", ".../deploy/lib/RoxyHttp.rb:352:inloop'", ".../deploy/lib/RoxyHttp.rb:352:in request'", ".../deploy/lib/MLClient.rb:110:ingo'", ".../deploy/lib/server_config.rb:1963:in get_sid'", ".../deploy/lib/server_config.rb:2056:inexecute_query_7'",".../deploy/lib/server_config.rb:510:in execute_query'",".../deploy/lib/server_config.rb:709:inbootstrap'", "deploy/lib/ml.rb:168:in `'"

我确认退出代码不为零:

echo %errorlevel%

12

下面是我在 NodeJS 中使用的相应代码——它总是给出 0 的退出代码:

var stdout = "";
let proc = child_process.spawn("ml.bat", ["profile", "bootstrap"], {shell:true}); 

proc.stdout.on('data', d => stdout += d.toString() + '\n';);
proc.on('close', exitcode => {
    console.log(stdout);

    if (exitcode !== 0) {
        console.log('ERROR in command');
        process.exit();
    }
});

我尝试使用多种变体(exec、execSync、spawnSync)和选项(shell、"cmd.exe /c"),但我永远无法使用 node.js 获得非零代码。该程序不会在 stderr 上打印任何输出。

知道如何在 NodeJS 中取回正确的错误代码吗?

如果想让Nodereturn子进程错误码,需要传递给exit函数....

process.exit(退出代码);

正如 Tom 在他的评论中提到的,“代码”未定义,因此需要修复。

Node Docs: process_process_exitcode

我建议您使用 child_process.spawnSync 这是一个阻塞调用,并且 returns 仅在该过程完成后使用。此外,返回的对象包括一个包含代码的错误属性

但在所有情况下——spawn 或 spawnSync 等,我相信如果子进程因任何原因失败,结果对象总是包含一个错误对象。所以检查这个对象是否存在可能就足够了。

为了解决这个问题,我在 ml.bat 中添加了以下最后一行:

exit /b %errorlevel%

现在它在 windows 和 linux 上的行为相同。