Не удается захватить вывод stdout дочернего процесса пакетного скрипта - PullRequest
2 голосов
/ 21 июня 2020

Используя 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?

...