2011-10-11 20 views
49

Tôi đang cố gắng thực thi lệnh cửa sổ thông qua cmd.exe trong node.js bằng cách sử dụng child_process.spawn. Nó thực hiện chính xác, nhưng chỉ hiển thị trong màu văn bản mặc định. Làm thế nào để tôi bảo quản màu sắc. Có thể không?bảo toàn màu khi thực hiện child_process.spawn

var spawn = require('child_process').spawn, 
    cmd = spawn('cmd', ['/s', '/c', 'C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild c:\\test.sln']); 

cmd.stdout.on('data', function(data){ 
    process.stdout.write(data); 
}); 

cmd.stderr.on('data', function(data){ 
    process.stderr.write(data); 
}); 

cmd.on('exit', function(code){ 
    console.log(code); 
}); 

Khi thực hiện qua nút, màu không được giữ nguyên. Executing via node.js

Khi thực hiện trực tiếp qua cmd.exe, có màu. (Đây là hành vi mong đợi). Làm thế nào để tôi nhận được hành vi này khi thực hiện thông qua nút. When executing through cmd.exe

+1

1 cho các ví dụ đơn giản, thực thi, và ảnh chụp màn hình đẹp giải thích ngay bây giờ và một lát sau. Tốt đẹp! – TooTallNate

Trả lời

7

Hãy thử điều này thay vì:

var spawn = require('child_process').spawn 
    , command = 'C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild c:\\test.sln' 
    , cmd = spawn('cmd', ['/s', '/c', command], { customFds: [0,1,2] }); 

cmd.on('exit', function(code){ 
    console.log(code); 
}); 

Lưu ý rằng tôi không tích cực hay không customFds công trình trên Windows. Tôi biết rằng chức năng cũ không được chấp nhận của nó không hoạt động, nhưng khi chỉ chuyển [0,1,2] làm fd's, tôi nghĩ rằng có một trường hợp đặc biệt cho điều đó.

Tôi đã thực hiện something similar here, nhưng tôi chỉ chạy lệnh đó trên các máy Unix. Vì vậy, hãy cho tôi biết nếu điều đó hoạt động trên Windows.

+0

cảm ơn. dường như hoạt động trên các cửa sổ. – prabir

+0

Bạn nên đánh dấu nó là "đã trả lời" rồi;) – TooTallNate

+0

Vì 'customFds' không được chấp nhận, có cách nào để thực hiện điều này mà không có' customFds' trên các máy Unix không? –

93

Có tùy chọn 'stdio' mới cho child_process.spawn(). Hãy thử theo dõi:

spawn("path to executable", ["params"], {stdio: "inherit"}); 

"Thừa kế" nghĩa là [0, 1, 2] hoặc [process.stdin, process.stdout, process.stderr].

+2

hoạt động như một sự quyến rũ, cảm ơn bạn ! – artur

+1

+1 Giải pháp tuyệt vời mà không cần sử dụng chức năng không dùng nữa. Chắc chắn câu trả lời chiến thắng theo ý kiến ​​của tôi. – knownasilya

+9

Hoạt động tuyệt vời! Lưu ý: các sự kiện funcs như 'spawnedThing.stdout.on' và' spawnedThing.stderr.on' sẽ không còn tồn tại vì nó kế thừa các luồng ghi từ cha mẹ của nó. Đã cho tôi một chút thời gian để nhận ra điều này trong khi tôi nhận được thông báo lỗi này: 'Không thể gọi phương thức 'trên' của null' –

4

giải pháp crossplatform mà làm việc đối với tôi là sử dụng cả hai shell: truestdio: 'inherit':

const spawn = require('child_process').spawn; 

spawn('node', ['./child.js'], { shell: true, stdio: 'inherit' }); 

nhờ @ 59naga https://github.com/nodejs/node/issues/2333

2

Nếu bạn muốn thể giữ màu sắc hoặc thêm một số ký hiệu cho đầu ra, bạn có thể thử mã bên dưới:

var spawn = require('child_process').spawn, 
var stream = require('stream'); 
cmd = spawn('cmd', ['/s', '/c', 'C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild c:\\test.sln'], { stdio: [process.stdin, process.stdout, 'pipe'] }); 
var customStream = new stream.Writable(); 
customStream._write = function (data, ...argv) { 
     console.log('your notation'); 
     process.stderr._write(data, ...argv); 
}; 
cmd.stderr.pipe(customStream); 

lưu ý rằng mã sử dụng es6

2

Điều này không khắc phục được sự cố cơ bản (thiếu luồng TTY thích hợp) nhưng nó sẽ giúp giải quyết vấn đề này.

Nếu quá trình phụ bạn đang sử dụng hỗ trợ màu (https://www.npmjs.com/package/supports-color) như phấn, thì bạn có thể đặt biến môi trường FORCE_COLOR thành bất kỳ giá trị nào và bỏ qua phần còn lại của séc. Điều này sẽ cho phép bạn tiếp tục sử dụng đường ống (và nắm bắt/sửa đổi dữ liệu trả về) không giống như sửa lỗi inherit.

Ngoài ra còn có mô đun nút-pty (https://www.npmjs.com/package/node-pty) cung cấp .spawn với khả năng chuyển pty (pseudo tty) có thể là câu trả lời toàn diện hơn. Tôi chưa chơi với nó, và tôi không chắc chắn liệu nó có phải là nền tảng chéo hay không.

3

Nếu bạn đang nhận được lỗi:

Cannot call method 'on' of null

Hãy thử điều này:

spawn("command", ["args"], { env : { FORCE_COLOR: true }}); 

làm việc với mocha

+1

Nếu bạn nhận được lỗi "nút sinh sản ENOENT", biến thể này làm việc cho tôi: 'process.env.FORCE_COLOR = true; đẻ trứng ("lệnh", ["args"], {env: process.env}); ' –

Các vấn đề liên quan