Aprende a ejecutar un archivo por lotes, recuperar datos y errores de él.

Cómo ejecutar un archivo .bat, recibir datos y errores con Electron Framework

Para lograr esta tarea, usaremos la clase child_process de Node.js. Desde child_processusaremos la función spawn, que nos permitirá ejecutar un proceso en segundo plano y agregar diferentes detectores de eventos. Lea más sobre la función de generación aquí .

Lote

En esta publicación asumiremos que tiene algún conocimiento sobre el lote, sin embargo, debe saber que para enviar información del lote a nuestra aplicación Electron, deberá generar el texto que desea enviar usando echo.

Todo el texto impreso con echoserá recuperado stdout.on("data")incluso por el evento 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

Para manejar el on("exit") evento de Electron y enviar un código de salida diferente del lote, use la siguiente línea (cambie el número según sus necesidades):

EXIT /B 1

Electron

Como se dijo antes, los datos recuperados de stderrstdouttendrán un formato Uint8Array, por lo tanto, necesitamos convertir Uint8Array a una cadena de Javascript (si necesita el formato de matriz, no lo convierta). Para convertir use la siguiente línea

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

Nota: el fragmento anterior funcionará para datos normales. Si su cantidad de datos es enorme, es posible que desee cambiar la forma en que se convierten los datos, lea más sobre cómo convertir Uint8Array en una cadena aquí .

Ahora que conocemos los conceptos básicos, ¡ejecutemos ese lote!

Ejecutando un archivo por lotes

Para este ejemplo, nuestro archivo por lotes será el siguiente (escrito para 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
)

Un simple fragmento que verificará si existe un archivo en la c:/ruta, si existe envía un mensaje que dice "El archivo ya existe", de lo contrario crea el archivo y envía el mensaje "Creando archivo en c:/electronfileexample.txt". Luego verifique si existe, si existe, luego finalice la ejecución con el código 2, si no existe, salga con el código 3.

Con Electron (usando Node.js) necesitará crear un proceso hijo. A diferencia de Python, node.js es asíncrono, eso significa que no espera script.bata que termine. En su lugar, llama a las funciones que define previamente cuando script.batimprime datos o existen.

Ahora, para manejar el lote desde javascript, use el siguiente código:

"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;
    }
});

La salida de la consola debe ser similar a (sin marcado HTML, solo vea la consola en el lado derecho):

Electron batch file child_process

Puede ver el ejemplo anterior en el repositorio oficial de ejemplos de electrones de ourcodeworld "electron-batch-childprocess" aquí . Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores