Я сейчас портирую библиотеку 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)