Выполнить двоичный файл командной строки с помощью Node.js

Я сейчас портирую библиотеку CLI с Ruby на Node.js. При необходимости я использую в своем коде несколько бинарных файлов сторонних разработчиков. Я не уверен, как лучше всего сделать это в Node.

Вот пример на Ruby, где я вызываю PrinceXML для преобразования файла в PDF:

  cmd = system ("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")  

Каков эквивалентный код в Node?


Для еще более новой версии Node.js (v8.1.4) события и вызовы аналогичны или идентичны до более старых версий, но рекомендуется использовать стандартные новые языковые функции. Примеры:

Для буферизованного вывода без форматирования потока (вы получаете все сразу) используйте child_process.exec :

  const {exec} = require ('child_process'); exec ('cat * .js bad_file | wc -l', (err, stdout, stderr) => {if (err) {//node  не удалось выполнить команду return;}//* весь * stdout и stderr (буферизованный) console.log (`stdout: $ {stdout}`); console.log (`stderr: $ {stderr}`);}  );  

Вы также можете использовать его с обещаниями:

  const util = require ('util'); const exec =  util.promisify (require ('child_process'). exec); асинхронная функция ls () {const {stdout, stderr} = await exec ('ls');  console.log ('стандартный вывод:', стандартный вывод);  console.log ('stderr:', stderr);} ls ();  

Если вы хотите получать данные постепенно кусками (вывод в виде потока), используйте child_process.spawn :

  const {spawn} = require ('child_process'); const child = spawn ('ls', ['-lh  ','/usr ']);//используем child.stdout.setEncoding (' utf8 ');  если вам нужен текст chunkschild.stdout.on ('data', (chunk) => {//данные из стандартного вывода здесь в виде буферов});//поскольку это потоки, вы можете перенаправить их в другое местоchild.stderr.pipe (  dest); child.on ('close', (code) => {console.log (`дочерний процесс завершился с кодом $ {code}`);});  

Обе эти функции имеют синхронный аналог. Пример для child_process.execSync :

  const {execSync} = require ('child_process');//stderr отправляется на stderr из  родительский процесс//вы можете установить options.stdio, если хотите, чтобы он перешел в другое место; let stdout = execSync ('ls');  

А также child_process.spawnSync :

  const {spawnSync} = require ('child_process'); const child = spawnSync ('ls', ['-lh', '/usr'  ]); console.log ('ошибка', child.error); console.log ('stdout', child.stdout); console.log ('stderr', child.stderr);  

Примечание. Следующий код все еще работает, но в первую очередь ориентирован на пользователей ES5 и более ранних версий.

Модуль для создания дочерних процессов с помощью Node.js хорошо задокументировано в документации (v5.0.0). Чтобы выполнить команду и получить ее полный вывод в виде буфера, используйте child_process.exec :

  var exec = require ('child_process')  .exec; var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf'; exec (cmd, function (error, stdout, stderr) {//вывод команды находится в stdout})  ;  

Если вам нужно использовать ввод-вывод процесса обработки с потоками, например, когда вы ожидаете больших объемов вывода, используйте child_process.spawn :

  var spawn = require ('child_process'). spawn; var child = spawn ('prince', ['-v', 'builds/pdf/book.  html ',' -o ',' builds/pdf/book.pdf ']); child.stdout.on (' data ', function (chunk) {//вывод будет здесь частями});//или если  вы хотите отправить вывод в другое местоchild.stdout.pipe (dest);  

Если вы выполняете файл, а не команду, вы можете использовать child_process. execFile , параметры которого почти идентичны параметрам spawn , но имеют четвертый параметр обратного вызова. как exec для получения буферов вывода. Это может выглядеть примерно так:

  var execFile = require ('child_process'). ExecFile; execFile (file, args, options, function (error, stdout, stderr)  {//вывод команды находится в stdout});  

Начиная с версии v0.11.12, Node теперь поддерживает синхронное порождение и exec . Все описанные выше методы являются асинхронными и имеют синхронный аналог. Документацию к ним можно найти здесь. Хотя они полезны для написания сценариев, обратите внимание, что в отличие от методов, используемых для асинхронного создания дочерних процессов, синхронные методы не возвращают экземпляр ChildProcess .

6


Узел JS v15.8.0 , LTS v14.15.4 и v12.20.1 — февраль 2021 г.

Асинхронный метод (Unix):

  'use strict'; const {spawn} = require ('child_process'); const ls = spawn ('ls', ['  -lh ','/usr ']); ls.stdout.on (' data ', (data) => {console.log (`stdout: $ {data}`);}); ls.stderr.on (  'data', (data) => {console.log (`stderr: $ {data}`);}); ls.on ('close', (code) => {console.log (`дочерний процесс завершился с  code $ {code} `);});  

Асинхронный метод (Windows):

  'use strict'; const {spawn} = require ('child_proc  ess ');//ПРИМЕЧАНИЕ: пользователям Windows эта команда может отличаться для некоторых пользователей.//Вы можете думать об этом как об использовании Node для выполнения чего-либо в вашей командной строке.//Если `cmd` работает там, это  здесь должно работать .//Если у вас есть проблема, попробуйте `dir`://const dir = spawn ('dir', ['. ']); const dir = spawn (' cmd ', ['/c ',' dir ']); dir.stdout.on (' data ', (data) => console.log (`stdout: $ {data  } `)); dir.stderr.on ('data', (data) => console.log (` stderr: $ {data} `)); dir.on ('close', (code) => console.  log (`дочерний процесс завершился с кодом $ {code}`));  

Sync:

  'use strict'; const {spawnSync} = require ('child_process'); const ls = spawnSync ('ls', ['-lh', '/usr']); console.  log (`stderr: $ {ls.stderr.toString ()}`); console.log (`stdout: $ {ls.stdout.toString ()}`);  

Из документации Node.js v15.8.0

То же самое касается документации Node.js v14.15.4 и документации Node.js v12.20.1

14


Вы ищете child_process.exec

Вот пример:

  const exec = require ('child_process'). Exec; const child  = exec ('cat * .js bad_file |  wc -l ', (ошибка, stdout, stderr) => {console.log (`stdout: $ {stdout}`);  console.log (`stderr: $ {stderr}`);  если (ошибка! == null) {console.log (`exec error: $ {error}`);  }});  

3


Начиная с версии 4 ближайшей альтернативой является метод child_process.execSync :

  const {execSync} = require ('child_process'  ); let output = execSync ('prince -v builds/pdf/book.html -o builds/pdf/book.pdf');  

⚠️ Примечание этот вызов execSync блокирует цикл обработки событий.

2


  const exec = require ("child_process"). execexec ("ls", (error, stdout, stderr) => {// сделайте что угодно})  

2


Если хотите что-то, что очень похоже на верхний ответ, но также синхронно тогда это будет работать.

  var execSync = require ('child_process'). execSync; var cmd = "echo 'hello world'"; var options = {encoding: 'utf8  '}; console.log (execSync (cmd, options));  


Я просто написал помощник Cli, чтобы легко работать с Unix/windows.

  define (["require", "export"], function (require,  Export) {/** * Помогает легко использовать интерфейс командной строки (CLI) как в Windows, так и в Unix. * Требуется подчеркивание или lodash как глобальные через "_". */var Cli = (function () {function Cli (  ) {}/** * Выполнить команду CLI. * Управлять средой Windows и Unix и попытаться выполнить команду на обоих env в случае неудачи. * Порядок: Windows -> Unix. * * @Param command Команда для выполнения. ('Grunt  ') * @param args Аргументы команды. (' watch ') * @param callback Success. * @param callbackErrorWindows Failure в Windows env. * @param callbackErrorUnix Failure в Unix env. */Cli.execute = function (command,  args, callback, callbackErrorWindows, callbackErrorUnix) {if (typeof args === "undefined") {args = [];} Cli.windows (command, args, callback, function () {callbackErrorWindows (); попробуйте {Cli.unix  (команда, аргументы, обратный вызов, callbackErrorUnix);} catch (e) {console.log ('-----  -------- Не удалось выполнить команду: «'+ command +'» во всех средах.  ------------- ');  }});  }; /** * Выполнение команды в среде Windows.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('watch') * @param callback Успешный обратный вызов.  * @param callbackError Обратный вызов при ошибке.  */Cli.windows = function (command, args, callback, callbackError) {if (typeof args === "undefined") {args = [];  } попробуйте {Cli._execute (process.env.comspec, _.union (['/c', command], args));  обратный вызов (команда, аргументы, 'Windows');  } catch (e) {callbackError (команда, аргументы, 'Windows');  }}; /** * Выполнение команды в среде Unix.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('watch') * @param callback Успешный обратный вызов.  * @param callbackError Обратный вызов при ошибке.  */Cli.unix = function (command, args, callback, callbackError) {if (typeof args === "undefined") {args = [];  } попробуйте {Cli._execute (команда, аргументы);  обратный вызов (команда, аргументы, 'Unix');  } catch (e) {callbackError (команда, аргументы, 'Unix');  }}; /** * Выполнение команды вне зависимости от среды.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('смотреть') * @private */Cli._execute = function (command, args) {var spawn = require ('child_process'). spawn;  var childProcess = spawn (команда, аргументы);  childProcess.stdout.on ("данные", функция (данные) {console.log (data.toString ());});  childProcess.stderr.on ("данные", функция (данные) {console.error (data.toString ());});  };  вернуть Cli;  }) ();  Export.Cli = Cli;});  

Исходный исходный файл Typescript:

  /** * Помощник для простого использования интерфейса командной строки (CLI) в средах Windows и Unix. * Требуется подчеркивание или lodash как глобальное через "_".  */export class Cli {/** * Выполнить команду CLI.  * Управляйте средой Windows и Unix и попробуйте выполнить команду на обоих env в случае неудачи.  * Порядок: Windows -> Unix.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('watch') * Успешный обратный вызов @param.  * @param callbackErrorWindows Failure в среде Windows.  * @param callbackErrorUnix Failure в Unix env.  */public static execute (command: string, args: string [] = [], callback?: any, callbackErrorWindows?: any, callbackErrorUnix?: any) {Cli.windows (command, args, callback, function () {callbackErrorWindows  (); попробуйте {Cli.unix (command, args, callback, callbackErrorUnix);} catch (e) {console.log ('------------- Не удалось выполнить команду: "'  + command + '"во всех средах. -------------');}});  }/** * Выполнение команды в среде Windows.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('watch') * @param callback Успешный обратный вызов.  * @param callbackError Обратный вызов при ошибке.  */публичные статические окна (command: string, args: string [] = [], callback?: any, callbackError?: any) {попробуйте {Cli._execute (process.env.comspec, _.union (['/c  ', команда], аргументы));  обратный вызов (команда, аргументы, 'Windows');  } catch (e) {callbackError (команда, аргументы, 'Windows');  }}/** * Выполняет команду в среде Unix.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('watch') * @param callback Успешный обратный вызов.  * @param callbackError Обратный вызов при ошибке.  */public static unix (команда: строка, аргументы: строка [] = [], обратный вызов?: любой, callbackError?: любой) {попробуйте {Cli._execute (command, args);  обратный вызов (команда, аргументы, 'Unix');  } catch (e) {callbackError (команда, аргументы, 'Unix');  }}/** * Выполнять команду независимо от среды.  * * @param command Команда для выполнения.  ('grunt') * @param args Аргументы команды.  ('смотреть') * @private */private static _execute (command, args) {var spawn = require ('child_process'). spawn;  var childProcess = spawn (команда, аргументы);  childProcess.stdout.on ("данные", функция (данные) {console.log (data.toString ());});  childProcess.stderr.on ("данные", функция (данные) {console.error (data.toString ());});  }} Пример использования: Cli.execute (Grunt._command, args, function (command, args, env) {console.log ('Grunt был выполнен автоматически. (' + Env + ')');}, function (  command, args, env) {console.error ('------------- Windows "' + command + '" команда не удалась, попытка Unix ... ---------  ------ ');}, function (command, args, env) {console.error (' ------------- Unix "'+ command +'" тоже не удалось выполнить команду. --------------- ');  });  

1


Теперь вы можете использовать shelljs (из узла v4) следующим образом:

  var shell = require ('shelljs'); shell.echo ('hello world')  ; shell.exec ('узел - версия')  

1


Используйте этот облегченный пакет npm : system-commands

Посмотрите здесь.

Импортируйте его следующим образом:

  const system = require ('system-commands')  

Выполните такие команды:

  system ('ls'). then (output => {console.log (output)}). catch (error  => {console.error (error)})  

1


Если вы не против зависимость и хотите использовать обещания, child-process-prom работает:

установка

  npm install child-process-prom --save  

Использование exec

   var exec = require ('child-process-prom'). exec; exec ('echo hello') .then (function (result) {var stdout = result.stdout;  вар stderr = result.stderr;  console.log ('стандартный вывод:', стандартный вывод);  console.log ('stderr:', stderr);  }) .catch (function (err) {console.error ('ERROR:', err);});  

использование порождения

  var spawn = require ('child-process-prom'). spawn; var prom = spawn ('echo', ['hello']); var childProcess = обещание.  childProcess; console.log ('[spawn] childProcess.pid:', childProcess.pid); childProcess.stdout.on ('данные', функция (данные) {console.log ('[spawn] stdout:', data.  toString ());}); childProcess.stderr.on ('данные', функция (данные) {console.log ('[spawn] stderr:', data.toString ());}); обещание.then (функция  () {console.log ('[spawn] done!');}) .catch (function (err) {console.error ('[spawn] ERROR:', err);});  


Ответ @ hexacyanide является почти полным. В Windows команда prince может быть prince.exe , prince.cmd , prince.bat или просто prince (я не знаю, как собираются драгоценные камни, но ящики npm поставляются с sh-скриптом и пакетным скриптом — npm и npm.cmd ). Если вы хотите написать переносимый скрипт, который будет работать в Unix и Windows, вы должны создать правильный исполняемый файл..

Вот простая, но переносимая функция создания:

  функция spawn (cmd, args, opt) {var isWindows =/win/.test  (процесс.платформа);  если (isWindows) {если (! args) args = [];  args.unshift (cmd);  args.unshift ('/c');  cmd = process.env.comspec;  } return child_process.spawn (cmd, args, opt);} var cmd = spawn ("принц", ["-v", "builds/pdf/book.html", "-o", "builds/pdf/book  .pdf "])//Используйте эти реквизиты для получения результатов выполнения://cmd.stdin;//cmd.stdout;//cmd.stderr;  



Команды запуска Windows 10, которые вы должны знать (но, вероятно, забыли)

Если вы знаете правильную клавиатуру ярлык и правильные команды, команда запуска Windows 10 может быть мощным инструментом. Мы исследуем 12 команд запуска, которые должен знать каждый.

В правильных руках Команда запуска Windows 10 может быть мощным инструментом. С помощью простого сочетания клавиш и нескольких нажатий клавиш пользователи Windows могут быстро добраться до места назначения в лабиринте экранов конфигурации операционной системы. Ключевым моментом является изучение, знание и запоминание общих команд запуска.

В этом практическом руководстве перечислены 12 распространенных команд запуска Windows 10, которые все пользователи Windows должны знать и уметь использовать при необходимости.

ПОСМОТРЕТЬ ЧАСТЬ 2: Другие команды запуска Windows 10, которые вы должны знать (но, вероятно, забыли). (TechRepublic)

12 распространенных команд запуска в Windows 10

Перво-наперво, самый эффективный способ вызвать диалоговое окно «Выполнить команду» — использовать эту комбинацию горячих клавиш: клавиша Windows + R.

На современных клавиатурах ПК обычно есть клавиша в нижнем ряду рядом с клавишей Left-Alt, отмеченной логотипом Windows — это клавиша Windows.

Вы также можете открыть команду «Выполнить», щелкнув правой кнопкой мыши кнопку меню «Пуск» и выбрав команду «Выполнить» из списка элементов. Но это менее эффективно и лишает возможности быстрой навигации в Windows 10.

СМ.: Лучшие команды запуска Windows 10 (бесплатный PDF) (TechRepublic)

Когда вы откроете команду «Выполнить», вам будет представлено простое поле ввода ( Рисунок A ). Вы введете свои команды в это поле и нажмите Enter или OK, чтобы выполнить их.

Рисунок A

Примечание. Кавычки предназначены только для выделения — они не являются частью самой команды и не должны быть включены в поле команды.

1. Откройте диск Windows 10 («»)
Если вы не изменили конфигурацию по умолчанию, при запуске проводника с панели задач будет отображаться содержимое библиотеки быстрого доступа. Предполагается, что именно здесь ваши документы, фотографии и другие файлы могут быть наиболее легко найдены, но иногда вы просто хотите открыть проводник в основной корневой папке жесткого диска (обычно C :).

Используйте команду «» — без кавычек.

2. Откройте домашнюю папку текущего пользователя («.»)
. Продолжая тему лучшего управления проводником, ввод одной точки («.») В поле команд приведет к прямому доступу к домашней папка текущего пользователя ( Рисунок B ).

Рисунок B

3. Откройте папку «Пользователи» («..»)
. Вариант предыдущей команды запуска, ввод двух точек («..») откроет проводник в папке «Пользователи», предоставляя быстрый доступ ко всем файлы и папки пользователя, если у вас есть соответствующие учетные данные. Это хорошая команда для выполнения системных административных задач.

4. Откройте панель управления («control»)
. В целях упрощения интерфейса Windows 10 поместила многие общие параметры конфигурации в область, известную как «Параметры», которую можно найти как запись в меню «Пуск». Хотя это нормально для многих параметров конфигурации, бывают случаи, когда вам необходимо загрузить полную папку панели управления Windows 10 ( Рисунок C ). В таких случаях введите «control» в поле «Выполнить».

Рисунок C

5. Откройте конфигурацию системы («msconfig»)
. Приложение Microsoft Configuration является наследником предыдущих версий операционной системы Windows, но по-прежнему полезно для Windows 10. При вводе «msconfig» откроется приложение. который предоставляет вам доступ к вариантам загрузки и позволяет блокировать или останавливать запуск определенных служб и приложений во время загрузки.

6. Откройте «Программы и компоненты» («appwiz.cpl»)
Еще глубже углубившись в область панели управления, бывают случаи, когда вы хотите удалить приложение. Этот процесс выполняется с помощью экрана «Программы и компоненты», который является подразделом Панели управления. Тем не менее, вы можете быстрее всего это сделать, набрав «appwiz.cpl» в поле «Выполнить».

СМОТРИ: Приложения для Windows 10: какие оставить, а какие сбросить? (бесплатный PDF) (TechRepublic)

7. Откройте служебную программу очистки диска («cleanmgr»)
Еще одним пережитком предыдущих версий Windows является служебная программа очистки диска.. Большинство процессов очистки диска в Windows 10 обрабатываются автоматически «за кулисами», но бывают случаи, когда вы можете захотеть выполнить очистку диска вручную. Введите «cleanmgr», чтобы открыть диалоговое окно «Очистка диска» ( Рисунок D ).

Рисунок D

8. Open Resource Monitor («resmon»)
Служебное приложение, которое большинство пользователей Windows игнорирует, но на самом деле не должно, — это монитор ресурсов Windows 10. Если ваш компьютер начинает отставать или кажется, что жесткий диск вращается без причины, выполните команду «resmon» и устраните проблему.

9. Открытие распространенных приложений Microsoft («calc», «notepad», «mspaint» и т. Д.)
Еще одно хорошее применение команды run — запуск базовых приложений Microsoft, которые вы не можете использовать каждый день и они не нужны на вашем рабочем столе или на панели задач, но вы все еще используете их время от времени. Например, приложение «Калькулятор». Откройте командное окно «Выполнить» и введите «calc», чтобы запустить его.

10. Отрегулируйте настройки мыши («main.cpl»)
. Одна из первых вещей, которые вам может понадобиться настроить на новом ПК с Windows 10, — это настройки мыши. Курсор мыши, который слишком маленький или слишком медленно движется по экрану, может раздражать. Самый быстрый способ перейти к настройкам мыши — открыть команду «Выполнить» и ввести в поле «main.cpl».

11. Откройте удаленный рабочий стол («mstsc»)
Современные сотрудники — это мобильные сотрудники, а это означает, что многим из нас приходится получать удаленный доступ к своим компьютерам рабочих станций с помощью приложения Windows 10 Remote Desktop ( Рисунок E ). Самый быстрый способ открыть приложение — открыть команду «Выполнить» и ввести в поле «mstsc».

Рисунок E

12. Доступ к системной информации («msinfo32»)
При устранении проблем со службой поддержки технический специалист нередко запрашивает подробную системную информацию. Вместо того, чтобы переходить по нескольким разным экранам, используйте сочетание клавиш Windows + R, введите «msinfo32» в поле и нажмите Enter.

Дополнительная подсказка для команды запуска

Когда вы попробуете эти различные команды запуска, вы заметите, что предыдущие команды будут запоминаться системой. Вы можете прокручивать ранее использованные команды, перемещаясь вверх и вниз по списку с помощью клавиш со стрелками — еще один способ уменьшить количество щелчков мыши и повысить эффективность интерфейса Windows 10.

Еженедельный бюллетень Microsoft

Будьте инсайдером Microsoft в своей компании, прочитав эти советы, рекомендации и шпаргалки по Windows и Office. Доставлено по понедельникам и средам

Зарегистрируйтесь сегодня

Также см.

  • Сочетания клавиш с логотипом Windows: полный список (TechRepublic)
  • 20 профессиональных советов, как заставить Windows 10 работать так, как вы хотите (бесплатный PDF) (TechRepublic)
  • Выбор стратегии выхода из Windows 7: четыре варианта (TechRepublic Premium)
  • Это бесплатное предложение по обновлению Windows 10 все еще работает. Вот почему — и как это получить (ZDNet)
  • Чтобы сохранить конфиденциальность ваших данных в Интернете, нужно потрудиться. Эти приложения могут помочь (CNET)
  • Как использовать режим Бога в Windows 10 (TechRepublic)
  • 10 самых важных Приложения для iPhone на все времена (Download.com)
  • Обязательно к прочтению: языки программирования и ресурсы по карьере разработчика (TechRepublic на Flipboard)
Оцените статью
clickpad.ru
Добавить комментарий