Появиться на 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. Есть идеи?

Ответ 1

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

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

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

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

Ответ 2

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

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

Используя 'inherit', вывод будет передан в текущий процесс.

Ответ 3

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

Если вы не планируете возвращать большое количество данных (более 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, это может означать, что данные, отправленные дочернему процессу не могут быть немедленно использованы.

Ответ 4

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

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