2013-08-20 27 views
10

Khi tôi chạy qua Node:đẻ trứng trên Node 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); 
}); 

tôi nhận được lỗi sau:

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

Trên Windows Server 2012. Bất cứ ý tưởng?

Trả lời

7

(Thứ nhất, không ls thực sự tồn tại trên cửa sổ?)

Tôi đã có một vấn đề sinh sản con giống xử lý một thời gian ngắn trở lại và nó đã cho tôi thời gian dài để tìm ra cách đúng để làm việc đó.

Dưới đây là một số mã ví dụ:

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

Hãy nhìn vào vé này cho một lời giải thích về vấn đề này: https://github.com/joyent/node/issues/2318

11

Như badsyntax chỉ ra, ls không tồn tại trên cửa sổ miễn là bạn không tạo bí danh. Bạn sẽ sử dụng 'dir'. Sự khác biệt là dir không phải là một chương trình, nhưng một lệnh trong cửa sổ shell (đó là cmd.exe), Vì vậy, bạn sẽ cần phải chạy 'cmd' với các đối số để chạy dir và đầu ra dòng.

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

Bằng cách sử dụng 'kế thừa', đầu ra sẽ được chuyển đến quy trình hiện tại.

1

Đã có hai câu trả lời cho câu hỏi này, nhưng tôi muốn đề cập đến một câu hỏi nữa và làm rõ điều gì đó.

Nếu bạn không có kế hoạch trở lại rất nhiều dữ liệu (hơn 200KB) từ lệnh của bạn, bạn có thể sử dụng exec thay vì đẻ trứng và ghi tao nhã hơn:

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

Đọc về difference between spawn and exec. để đảm bảo nó phù hợp với nhu cầu của bạn.

Để làm rõ, không cần phải vượt qua {stdio: 'inherit'} để sinh ra vì nó tạo đường ống theo mặc định. từ 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 mã sau đây làm việc cho tôi ..

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}`); 
}); 
Các vấn đề liên quan