Используя Node.js, я пишу пакетный сценарий Windows, который вызывает некоторые внешние программы. Я хочу выполнить этот сценарий и захватить его вывод (и вывод его дочерних элементов), чтобы иметь возможность отображать его внутри контейнера HTML (я пишу приложение Electron). На Linux я генерирую сценарий Bash, который отлично работает и вывод которого я могу правильно записать. Однако, как только пакетный сценарий Windows порождает свои дочерние процессы, я не могу захватить их stdout
и stderr
; единственный выход, который ловит child.stdout.on ("data", () => { /* ... */ });
, - это сам пакетный сценарий.
Я пробовал различные варианты того, как пакетный сценарий вызывает внешние программы, но ни один из них не дал желаемого эффекта: все они открылись новое окно cmd.exe
. Используя совет от start /?
, я сейчас вызываю программы следующим образом:
start /b /wait PROGRAM ARGUMENTS
(где PROGRAM
, например, pdflatex.exe
.) Добавляя 2>&1
, я смог подавить новые cmd.exe
windows, запустив пакетный сценарий из окна cmd.exe
, но не вызывая его из Node.js. Я использую следующий код для вызова пакетного сценария:
const { spawn } = require ("child_process");
var child = spawn (
"call",
[ "path/to/batch.bat" ],
{
detached: true,
shell: true
}
);
Прямой вызов пакетного сценария с использованием пути к нему в качестве аргумента команды spawn ();
также не дал желаемого эффекта.
Другой метод вызова пакетного сценария и внешних программ, который я пробовал, но который также не дал желаемого результата, заключался в прямом вызове внешних программ из пакетного сценария, например
C:\Full\Path\To\pdflatex.exe -halt-on-error -output-format=pdf file.tex
и используя полный путь пакетного сценария в качестве аргумента command
для spawn ();
, например:
const { spawn } = require ("child_process");
var child = spawn (
"C:/Full/Path/To/Batch.bat",
[ ],
{
detached: true,
shell: true
}
);
Это, как и все другие методы, захватило вывод процесса cmd.exe
, интерпретирующего сценарий, но открытого новое окно cmd.exe
для всех внешних программ, вызываемых пакетным скриптом. Единственное другое содержимое пакетного сценария находится в следующих строках:
@echo off
REM Cd into the desired working directory
CD /D "C:\Path\To\Cwd"
REM Execute external programs like pdflatex:
C:\Full\Path\To\pdflatex.exe -halt-on-error -output-format=pdf file.tex
Ничто в пакетном сценарии не должно фактически мешать тому, как обрабатываются команды, но, очевидно, это не так. 1036 * Я могу изменить вызов на spawn ();
только на Windows; однако я должен запускать внешние программы с помощью пакетного сценария, а не использовать spawn ();
напрямую, потому что есть требование обратной совместимости, которое я должен выполнить.
Итак, в конце концов, как я смогу захватить внука обрабатывает 'stdout
, используя пакетный скрипт в Node.js?