2013-08-20 22 views
10

Quando ho eseguito questo attraverso Node:Spawn sul nodo JS (Windows Server 2012)

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

ottengo il seguente errore:

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

In Windows Server 2012. Tutte le idee?

risposta

7

(In primo luogo, fa ls in realtà esiste in Windows?)

Ho avuto un simile problema bambino la deposizione delle uova elabora un po 'indietro e mi c'è voluto molto tempo per capire il modo corretto di farlo.

Ecco qualche esempio di codice:

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

Date un'occhiata a questo biglietto per una spiegazione del problema: https://github.com/joyent/node/issues/2318

11

Come badsyntax sottolineato, non esiste ls su Windows fino a quando si non ha creato un alias. Utilizzerai 'dir'. La differenza è dir non è un programma, ma un comando in windows shell (che è cmd.exe), quindi è necessario eseguire 'cmd' con gli argomenti per eseguire dir e generare il flusso.

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

Utilizzando 'inherit', l'output verrà reindirizzato al processo corrente.

1

Ci sono già due risposte operative a questa domanda, ma vorrei menzionarne un'altra e chiarire qualcosa.

Se non si ha intenzione di restituire un sacco di dati (più di 200kB) dal vostro comando, è possibile utilizzare exec invece di deporre le uova e scrivere più elegantemente:

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

Leggi difference between spawn and exec. per assicurarti che soddisfi le tue esigenze.

Per quanto riguarda i chiarimenti, non è necessario passare {stdio: 'inherit'} per spawn perché crea i pipe di default. da the documentation:

By default, pipes for stdin, stdout and stderr are established between the parent Node.js process and the spawned child. It is possible to stream data through these pipes in a non-blocking way. Note, however, that some programs use line-buffered I/O internally. While that does not affect Node.js, it can mean that data sent to the child process may not be immediately consumed.

1

Hi seguente codice ha funzionato per me ..

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