SORU
22 Ocak 2013, Salı


node.js kabuk komut çalıştırma

Hala linux veya windows kabuk komutunu çalıştırın ve çıkış yakalamak nasıl ince noktalarını kavramak node.js; sonuçta, böyle bir şey yapmak istiyorum içinde çalışıyorum

//pseudocode
output = run_command(cmd, args)

Önemli parçası output genel kapsamlı bir değişken (veya nesne) mevcut olmalıdır. Aşağıdaki işlevi denedim, ama nedense undefined basılı konsola

function run_cmd(cmd, args, cb) {
  var spawn = require('child_process').spawn
  var child = spawn(cmd, args);
  var me = this;
  child.stdout.on('data', function(me, data) {
    cb(me, data);
  });
}
foo = new run_cmd('dir', ['/B'], function (me, data){me.stdout=data;});
console.log(foo.stdout);  // yields "undefined" <------

Sorun yukarıdaki kod sonları anlamakta güçlük çekiyorum... bu model çok basit bir prototip çalışıyor...

function try_this(cmd, cb) {
  var me = this;
  cb(me, cmd)
}
bar = new try_this('guacamole', function (me, cmd){me.output=cmd;})
console.log(bar.output); // yields "guacamole" <----

Biri bana try_this() çalışır run_cmd() değil neden anlamanıza yardımcı olabilir? FWIW, child_process.exec 200 KB arabellek sınırı vardır çünkü child_process.spawn kullanmak istiyorum.

KELLE ÖDÜLÜ

Hiçbir başarı ile ilk cevap şu ana kadar çalıştım...

// run my shell command
function run_cmd(cmd, args, cb) {
  var spawn = require('child_process').spawn
  var child = spawn(cmd, args);
  var me = this;
  child.stdout.on('data', function(data) {
    cb(me, data);
  });
}

// Run C:\Windows\System32\netstat.exe -an
foo = new run_cmd('netstat.exe', ['-an'], function (me, data){me.stdout=data;});

app.listen(3000);
console.log('Express app started on port 3000');
console.log(foo.stdout); // <----- Still yields 'undefined'

Bonus olacak layık kişi kim olabilir doğru nedir yanlış olan benim varolan kodu gibi bir şey arayın. foo = new run_cmd('netstat.exe', ['-an'], function (me, data){me.stdout=data;}); ve al çıktı foo.stdout (küresel değişken kapsamı).

Son Karar

James White cevabı kabul ediyorum, ama bu benim için çalıştı tam kodunu

function cmd_exec(cmd, args, cb_stdout, cb_end) {
  var spawn = require('child_process').spawn,
    child = spawn(cmd, args),
    me = this;
  me.exit = 0;  // Send a cb to set 1 when cmd exits
  child.stdout.on('data', function (data) { cb_stdout(me, data) });
  child.stdout.on('end', function () { cb_end(me) });
}
foo = new cmd_exec('netstat', ['-rn'], 
  function (me, data) {me.stdout  = data.toString();},
  function (me) {me.exit = 1;}
);
function log_console() {
  console.log(foo.stdout);
}
setTimeout(
  // wait 0.25 seconds and print the output
  log_console,
250);

CEVAP
24 Ocak 2013, PERŞEMBE


Düzeltilmesi gereken üç konu var:

İlkstdout uyumsuz olarak kullanırken. senkron davranış bekliyoruz. Tüm aramalar run_cmd fonksiyonudur uyumsuz, bu yüzden olacak spawn çocuk süreci dönüş hemen bakılmaksızın bazı, hepsi, ya da hiçbiri veri okunup okunmadığını kapalı stdout. Çalıştırdığınızda gibi

console.log(foo.stdout);

ne olursa olsun foo depolanır.şu anda stdout, ve bu çocuk senin süreç hala çalışıyor olabilir, çünkü ne olacağına dair bir garanti yok.

İkincibu stdout readable stream, 1). data olayı birden çok kez, ve 2) çağrılabilir geri arabellek verilir, bir dize. Kolay çözüm; sadece değiştirin

foo = new run_cmd(
    'netstat.exe', ['-an'], function (me, data){me.stdout=data;}
);

içine

foo = new run_cmd(
    'netstat.exe', ['-an'], function (me, buffer){me.stdout =buffer.toString();}
);

bir dize içine tampon aktardık ve stdout bizim değişken bir dize ekleyin.

Üçüncütek gidince tüm çıkış aldık, biliyorsun bu 'son' bir dinleyici ve geri arama: ihtiyacımız var anlamına gelen olay

function run_cmd(cmd, args, cb, end) {
    // ...
    child.stdout.on('end', end);
}

Yani, nihai sonuç şudur:

function run_cmd(cmd, args, cb, end) {
    var spawn = require('child_process').spawn,
        child = spawn(cmd, args),
        me = this;
    child.stdout.on('data', function (buffer) { cb(me, buffer) });
    child.stdout.on('end', end);
}

// Run C:\Windows\System32\netstat.exe -an
var foo = new run_cmd(
    'netstat.exe', ['-an'],
    function (me, buffer) { me.stdout  = buffer.toString() },
    function () { console.log(foo.stdout) }
);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Art Food Kitty - Kelly Eddington

    Art Food Kit

    7 Kasım 2006
  • Booredatwork.com

    Booredatwork

    5 Ocak 2009
  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007