Появиться на 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}`);
});