Как выполнить файл .bat, получить данные и ошибки с Electron Framework

Для достижения этой цели мы будем использовать child_process класс Node.js. От child_process мы будем использовать функцию spawn, которая позволит нам выполнять процесс в фоновом режиме и добавлять различные прослушиватели событий. Узнайте больше о функции возрождения здесь.

партия

В этом посте мы предполагаем, что у вас есть некоторые знания о пакете, однако вы должны знать, что для отправки информации из пакета в наше приложение Electron вам необходимо вывести текст, который вы хотите отправить, используя echo,

Весь текст напечатан с echo будет получен stdout.on("data") событие child_process.

echo This text will be sent as Uint8Array for being processed later by your Electron App
REM Note that you can send 2 types of data (normal and error)
REM To send normal data
echo Hello world 2>&1
REM To send error data (but don't stop the execution)
echo This text should ouput an error 1>&2

Чтобы справиться с on("exit") событие Electron и отправьте другой код выхода из партии, используйте следующую строку (измените номер в соответствии с вашими потребностями):

EXIT /B 1

электрон

Как сказано выше, данные, полученные из stderr а также stdout будет иметь формат Uint8Array, поэтому нам нужно преобразовать Uint8Array в строковый Javascript (если вам нужен формат массива, не конвертируйте его). Для конвертации используйте следующую строку

var myReceivedData = ; // This will be the Uint8Array Data
var strData = String.fromCharCode.apply(null, myReceivedData); // The array is now human readable text

Примечание: предыдущий фрагмент будет работать для обычных данных. Если ваш объем данных огромен, вы можете изменить способ преобразования данных, пожалуйста, Узнайте больше о том, как преобразовать Uint8Array в строку здесь.

Теперь, когда мы знаем основы, давайте выполним эту партию!

Выполнение командного файла

Для этого примера наш пакетный файл будет следующим (написанный для Windows electronexample.bat):

@echo off
REM The name of the file that will be created
set filename=electronfileexample.txt
REM the path where the file will be created
set filepath=c:\
REM the content of the file
set content=Hello, this is the content of my file created with batch
REM the full path (path+filename)
set fullpath=%filepath%%filename%
echo Sending a "JSON" String
echo {"filename":"%filename%","content":"%content%","fullpath":"%fullpath%"}
REM Text to send to stdout (data)
REM Note that you can append 2>&1 to the normal stdout
REM echo This text will be sent to my Electron Project
REM or
REM echo This text will be sent to my Electron Project 2>&1
REM Text to send to stderr (error) 1>&2
REM echo This text should ouput an error 1>&2
echo An error message passing by, nothing important :) Just ignore me 1>&2
IF EXIST %filepath%%filename% (
echo File already exists
EXIT /B 1
) ELSE (
@echo Creating file in %fullpath%
(
echo %content%
) > %filepath%%filename%
)
REM Check if the file was created, if exists send code 2
REM if the file doesn't exist then send code 3 (error while creating)
IF EXIST %filepath%%filename% (
EXIT /B 2
) ELSE (
EXIT /B 3
)

Простой фрагмент, который проверит, существует ли файл в c:/ путь, если существует, отправьте сообщение «Файл уже существует», в противном случае создайте файл и отправьте сообщение «Создание файла в c:/electronfileexample.txtMsgstr «Затем проверьте, существует ли он, и завершите выполнение с помощью кода. 2, если не существует, выйдите с кодом 3,

С Electron (используя Node.js) вам нужно будет создать дочерний процесс. В отличие от Python, node.js является асинхронным, это означает, что он не ожидает script.bat быть законченным. Вместо этого он вызывает функции, которые вы определили ранее, когда script.bat печатает данные или существует.

Теперь, чтобы обработать пакет из JavaScript, используйте следующий код:

"use strict";
// The path to the .bat file
var myBatFilePath = "C:\\Users\\SDkCarlos\\Desktop\\electrontest.bat";
const spawn = require('child_process').spawn;
const bat = spawn('cmd.exe', ['/c', myBatFilePath]);
// Handle normal output
bat.stdout.on('data', (data) => {
// As said before, convert the Uint8Array to a readable string.
var str = String.fromCharCode.apply(null, data);
console.info(str);
});
// Handle error output
bat.stderr.on('data', (data) => {
// As said before, convert the Uint8Array to a readable string.
var str = String.fromCharCode.apply(null, data);
console.error(str);
});
// Handle on exit event
bat.on('exit', (code) => {
var preText = `Child exited with code ${code} : `;
switch(code){
case 0:
console.info(preText+"Something unknown happened executing the batch.");
break;
case 1:
console.info(preText+"The file already exists");
break;
case 2:
console.info(preText+"The file doesn't exists and now is created");
break;
case 3:
console.info(preText+"An error ocurred while creating the file");
break;
}
});

Вывод консоли должен быть похож на (без разметки HTML, смотрите только консоль справа):

Электронный пакетный файл child_process

Вы можете увидеть предыдущий пример в Официальный репозиторий электронных кодов нашего кода «электронный-пакет-дочерний процесс» здесь. Повеселись

Ссылка на основную публикацию
Adblock
detector