2016-10-12 1 views
0

Я пытаюсь получить правильный код выхода из пакетного файла с помощью nodejs в Windows.child_process не возвращает правильный код выхода из командного файла

При запуске из командной строки, я вижу ожидаемый код ошибки:

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"), но я никогда не могу получить ненулевой код с помощью узла. Программа не печатает какой-либо вывод на stderr.

Любая идея, как вернуть правильный код ошибки в NodeJS?

+0

Вы назвали параметр, переданный вашему обратному вызову 'exitcode', но вы проверяете' code'. Я предполагаю, что это опечатка в вашем примере кода, так как это приведет к 'ReferenceError' –

+0

да. опечатка. благодаря! – chriskelly

ответ

0

Чтобы решить эту проблему, я добавил следующую последнюю строку ml.bat:

exit /b %errorlevel% 

Теперь он ведет себя одинаково на обоих окнах и Linux.

0

Если вы хотите узла вернуть код ошибки дочернего процесса, вам нужно передать его в функцию выхода ....

process.exit (ExitCode);

Как Том упоминает в своем комментарии, «код» не определен, поэтому его необходимо устранить.

См Node Docs: process_process_exitcode

+0

Спасибо, но меня действительно не интересует собственный код выхода узла. Только код выхода дочернего процесса. – chriskelly

0

Я полагаю, что вы используете child_process.spawnSync, который вызывает блокировку и возвращает только после завершения процесса. Кроме того, возвращенный объект включает в себя ошибку property, которая содержит код.

Но во всех случаях - spawn or spawnSync и т. Д. Я считаю, что объект результата всегда включает объект ошибки, если подпроцесс не работает по какой-либо причине. Поэтому проверка наличия этого объекта, вероятно, достаточно.

+0

Спасибо, Дэвид. Попробовали spawnSync, execSync и exec. Проблема в том, что код, возвращаемый в NodeJS, всегда равен 0, хотя окна (cmd) сообщают правильный уровень ошибок после запуска командного файла. Так или иначе, истинный код ошибки отменяется. – chriskelly

Смежные вопросы