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:in
loop'", ".../deploy/lib/RoxyHttp.rb:352:in request'", ".../deploy/lib/MLClient.rb:110:in
go'", ".../deploy/lib/server_config.rb:1963:in get_sid'", ".../deploy/lib/server_config.rb:2056:in
execute_query_7'",".../deploy/lib/server_config.rb:510:in execute_query'",".../deploy/lib/server_config.rb:709:in
bootstrap'", "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 在他的评论中提到的,“代码”未定义,因此需要修复。
我建议您使用 child_process.spawnSync 这是一个阻塞调用,并且 returns 仅在该过程完成后使用。此外,返回的对象包括一个包含代码的错误属性。
但在所有情况下——spawn 或 spawnSync 等,我相信如果子进程因任何原因失败,结果对象总是包含一个错误对象。所以检查这个对象是否存在可能就足够了。
为了解决这个问题,我在 ml.bat 中添加了以下最后一行:
exit /b %errorlevel%
现在它在 windows 和 linux 上的行为相同。
我试图在 Windows.
上使用 nodejs 从批处理文件中获取正确的退出代码当从命令行 运行 时,我看到预期的错误代码:
ml.bat profile bootstrap
ERROR: [".../deploy/lib/RoxyHttp.rb:362:in
block in request'", ".../deploy/lib/RoxyHttp.rb:352:in
loop'", ".../deploy/lib/RoxyHttp.rb:352:inrequest'", ".../deploy/lib/MLClient.rb:110:in
go'", ".../deploy/lib/server_config.rb:1963:inget_sid'", ".../deploy/lib/server_config.rb:2056:in
execute_query_7'",".../deploy/lib/server_config.rb:510:inexecute_query'",".../deploy/lib/server_config.rb:709:in
bootstrap'", "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 在他的评论中提到的,“代码”未定义,因此需要修复。
我建议您使用 child_process.spawnSync 这是一个阻塞调用,并且 returns 仅在该过程完成后使用。此外,返回的对象包括一个包含代码的错误属性。
但在所有情况下——spawn 或 spawnSync 等,我相信如果子进程因任何原因失败,结果对象总是包含一个错误对象。所以检查这个对象是否存在可能就足够了。
为了解决这个问题,我在 ml.bat 中添加了以下最后一行:
exit /b %errorlevel%
现在它在 windows 和 linux 上的行为相同。