Спавн на Node JS (Windows Server 2012)

Когда я запускаю это через Node:

var spawn = require('child_process').spawn;

ls = spawn('ls', ['C:\\Users']);

ls.on('error', function (err) {
  console.log('ls error', err);
});

ls.stdout.on('data', function (data) {
    console.log('stdout: ' + data);
});

ls.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
});

ls.on('close', function (code) {
    console.log('child process exited with code ' + code);
});

Я получаю следующую ошибку:

ls error { [Error: spawn ENOENT] code: 'ENOENT', errno: 'ENOENT', syscall: 'spawn' }
child process exited with code -1

На Windows Server 2012. Есть идеи?


person fire    schedule 20.08.2013    source источник


Ответы (5)


(Во-первых, действительно ли ls существует в Windows?)

У меня была похожая проблема, порождающая дочерние процессы некоторое время назад, и мне потребовались годы, чтобы понять, как это сделать правильно.

Вот пример кода:

var spawn = require('child_process').spawn;
var cp = spawn(process.env.comspec, ['/c', 'command', '-arg1', '-arg2']);

cp.stdout.on("data", function(data) {
    console.log(data.toString());
});

cp.stderr.on("data", function(data) {
    console.error(data.toString());
});

Взгляните на этот билет для объяснения проблемы: https://github.com/joyent/node/issues/2318

person badsyntax    schedule 20.08.2013

Как указал badsyntax, ls не существует в Windows, пока вы не создали псевдоним. Вы будете использовать «реж». Разница в том, что dir - это не программа, а команда в оболочке Windows (которая является cmd.exe), поэтому вам нужно будет запустить «cmd» с аргументами для запуска dir и вывода потока.

var spawn = require('child_process').spawn
spawn('cmd', ['/c', 'dir'], { stdio: 'inherit'})

При использовании «наследовать» вывод будет передан текущему процессу.

person Andy    schedule 27.01.2014

Начиная с узла 8 для каждого документа, вам необходимо установить для параметра оболочки значение true (по умолчанию это значение false).

spawn('dir', [], { shell: true })

Документация здесь

person Gorky    schedule 19.07.2018
comment
Это самый новый и лучший ответ ИМХО. - person Levent Divilioglu; 14.09.2018
comment
Это лучший ответ, потому что он охватывает все ответы других. Фактически, shell: true использует process.env.comspec и возвращается к cmd /c в Windows и использует /bin/sh в системах unix. - person Sebastian Kaczmarek; 16.05.2019
comment
Большой! это сработало - person Abhay; 10.05.2021

На этот вопрос уже есть два рабочих ответа, но хотелось бы упомянуть еще об одном и кое-что уточнить.

Если вы не планируете возвращать много данных (более 200 КБ) из вашей команды, вы можете использовать exec вместо spawn и более элегантно написать:

exec('dir [possible arguments]', (err, stdout, stderr) => {
    console.log(`stdout: ${stdout}`)
})

Прочтите о разнице между spawn и exec. . чтобы убедиться, что он соответствует вашим потребностям.

Что касается разъяснений, нет необходимости передавать {stdio: 'inherit'} для создания, потому что он создает каналы по умолчанию. из документации:

По умолчанию каналы для stdin, stdout и stderr устанавливаются между родительским процессом Node.js и порожденным дочерним процессом. Данные можно передавать через эти каналы неблокирующим образом. Обратите внимание, однако, что некоторые программы используют внутри себя ввод-вывод с линейной буферизацией. Хотя это не влияет на Node.js, это может означать, что данные, отправленные дочернему процессу, не могут быть использованы немедленно.

person Nicola Pedretti    schedule 21.10.2016

Привет, следующий код работал у меня..

const spawn = require('child_process').spawn;
const bat = spawn('cmd.exe', ['/c','calc.exe']);

bat.stdout.on('data', (data) => {
  console.log(data);
});

bat.stderr.on('data', (data) => {
  console.log(data);
});

bat.on('closed', (code) => {
 alert(`Child exited with code ${code}`);
});
person Sandeep Ks    schedule 07.12.2016