2013-08-20 9 views
10

Wenn ich dies durch Knoten auszuführen:Spawn auf Knoten 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); 
}); 

ich die folgende Fehlermeldung erhalten:

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

auf Windows Server 2012. Irgendwelche Ideen?

Antwort

7

(Erstens tut ls existieren tatsächlich auf Windows?)

Ich hatte ein ähnliches Problem Laich Kind, während ein wenig zurück verarbeitet und es hat mir im Alter die richtige Art und Weise, es zu tun, um herauszufinden.

Hier einige Beispiel-Code:

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

Werfen Sie einen Blick auf dieses Ticket für eine Erklärung des Problems: https://github.com/joyent/node/issues/2318

11

Wie badsyntax wies darauf hin, ls auf Fenster existiert nicht, solange Sie hat keinen Alias ​​erstellt. Sie werden "dir" verwenden. Der Unterschied ist dir ist kein Programm, aber ein Befehl in der Windows-Shell (das ist cmd.exe), also müssten Sie "cmd" mit Argumenten ausführen, um dir auszuführen und den Stream auszugeben.

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

Mit 'inherit' wird die Ausgabe an den aktuellen Prozess weitergeleitet.

1

Es gibt bereits zwei funktionierende Antworten auf diese Frage, aber ich möchte noch etwas erwähnen und etwas klären.

Wenn Sie nicht planen, eine Menge Daten (mehr als 200kB) zurückzukehren, von Ihrem Befehl können Sie exec statt Laich und eleganten Schreib verwenden:

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

Lesen Sie mehr über difference between spawn and exec. um sicherzustellen, dass es Ihren Bedürfnissen entspricht.

Wie für die Erläuterungen, gibt es keine Notwendigkeit, {stdio: 'inerit'} zu spawnen, weil es die Pipes standardmäßig erstellt. von 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

Hallo folgenden Code für mich gearbeitet ..

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