Учебник по Electron.js

Запуск внешних программ

Запустить внешнюю программу и получить результат ее выполнения позволяют функции exec(), execFile() и spawn() из модуля child_process. Импорт функций из модуля:

const { exec, execFile, spawn } = require('child_process');

Функция exec() выполняет команду, переданную в первом параметре. Формат функции:

<ChildProcess> = exec(<Команда>[, <Опции>][, <Функция>])

В параметре <Опции> можно передать объект с опциями. Полный список опций см. в документации. В параметре <Функция> указывается ссылка на функцию, которая будет вызвана при завершении выполнения команды. Функция принимает три параметра. Через первый параметр доступен объект ошибки или значение null. Через второй параметр доступны данные, выведенные в поток stdout, в виде строки или Buffer. Через третий параметр доступны данные, выведенные в поток stderr, в виде строки или Buffer. Объект Buffer возвращается, если опция encoding имеет значение buffer или указана не поддерживаемая кодировка. Функция возвращает объект ChildProcess. Операция выполняется асинхронно.

Пример преобразования изображения из формата JPEG в формат PNG с помощью программы ImageMagick при нажатии кнопки:

document.getElementById('btn1').addEventListener('click', () => {
   exec('C:\\ImageMagick\\convert photo.jpg photo.png', {
      cwd: __dirname,
      timeout: 3000,
      encoding: 'utf8'
   }, (err, stdout, stderr) => {
      if (err) {
         console.log(err);
         return;
      }
      console.log('stdout', stdout);
      console.log('stderr', stderr);
   });
});

Функция execFile() имеет следующий формат:

<ChildProcess> = execFile(<Путь к файлу>[, <Аргументы>][, <Опции>][,
                          <Функция>])

В первом параметре указывается путь к запускаемому файлу. Обратите внимание: нельзя запустить файлы с расширениями bat и cmd, но можно запустить exe. Аргументы, передаваемые программе, задаются в виде массива строк во втором параметре. В параметре <Опции> можно передать объект с опциями. Полный список опций см. в документации. В параметре <Функция> указывается ссылка на функцию, которая будет вызвана при завершении выполнения команды. Функция принимает три параметра. Через первый параметр доступен объект ошибки или значение null. Через второй параметр доступны данные, выведенные в поток stdout, в виде строки или Buffer. Через третий параметр доступны данные, выведенные в поток stderr, в виде строки или Buffer. Объект Buffer возвращается, если опция encoding имеет значение buffer или указана не поддерживаемая кодировка. Функция возвращает объект ChildProcess. Операция выполняется асинхронно.

Пример:

document.getElementById('btn2').addEventListener('click', () => {
   execFile('C:\\ImageMagick\\convert', ['photo.jpg', 'photo.png'], {
      cwd: __dirname,
      timeout: 3000,
      encoding: 'utf8'
   }, (err, stdout, stderr) => {
      if (err) {
         console.log(err);
         return;
      }
      console.log('stdout', stdout);
      console.log('stderr', stderr);
   });
});

Функции exec() и execFile() ограничены объемом получаемых данных. Если объем превышает значение опции maxBuffer, то будет ошибка. Функция spawn() лишена этого недостатка. Формат функции:

<ChildProcess> = spawn(<Команда>[, <Аргументы>][, <Опции>])

В первом параметре указывается команда или путь к запускаемому файлу. Аргументы, передаваемые программе, задаются в виде массива строк во втором параметре. В параметре <Опции> можно передать объект с опциями. Полный список опций см. в документации. Функция возвращает объект ChildProcess. Операция выполняется асинхронно.

Получим EXIF-данные из изображения IMG_5377.cr2:

document.getElementById('btn3').addEventListener('click', () => {
   let cp = spawn('C:\\ImageMagick\\identify',
                  ['-verbose', 'IMG_5377.cr2'], { cwd: __dirname });
   cp.stdout.on('data', data => {
      console.log(data.toString());
   });
   cp.stderr.on('data', data => {
      console.log('stderr', data.toString());
   });
   cp.on('error', e => {
      console.log('error', e);
   });
   cp.on('close', code => {
      console.log('close', code);
   });
});

Обработчик события data будет вызываться несколько раз для каждой порции данных.

Примечание

Существуют также функции execSync(), execFileSync() и spawnSync(), которые операцию выполняют синхронно. За подробной информацией обращайтесь к документации.