दिलचस्प पोस्ट
जावा गणन और इटरेटर के बीच का अंतर एंड्रॉइड में एक फाइल की एक कॉपी कैसे बनाऊं? ActiveRecord, has_many: through, और पोलीमॉर्फिक एसोसिएशन्स योसेमाइट और वालग्रिंड लैम्ब्डा अभिव्यक्ति में पुनरावृत्ति चर का उपयोग करना क्यों बुरा है Iostream और iostream.h के बीच का अंतर Ember.js का उपयोग करते हुए, व्यू प्रस्तुत करने के बाद मैं कुछ जेएस कैसे चला सकता हूं? आईओएस: एक सबव्यू के लिए ऑटोरेटेशन को अक्षम करें बहिष्कृत jQuery टॉगल इवेंट के समतुल्य रद्द करके अलार्म मैनेजर से अलार्म हटाएं () – एंड्रॉइड Xcode बीटा 6.1 और Xcode 6 जीएम अजीब कारण के लिए अनुक्रम अनुक्रमण कैसे HTTP त्रुटि 429 से बचने के लिए (बहुत अधिक अनुरोध) अजगर सी # कैसे एक घटना को झुका हुआ है खोजने के लिए कैसे nth jQuery तत्व प्राप्त करने के लिए रिटर्न स्टेटमेंट बनाम निकास () में मुख्य ()

node.js शेल कमांड निष्पादन

मैं अब भी बेहतर अंक समझने की कोशिश कर रहा हूं कि मैं कैसे लिनक्स या विंडोज़ शेल कमांड चला सकता हूं और आउटपुट को नोड। जेएस के भीतर कैप्चर कर सकता हूं; आखिरकार, मैं ऐसा कुछ करना चाहता हूं …

//pseudocode output = run_command(cmd, args) 

महत्वपूर्ण टुकड़ा यह है कि output को ग्लोबल स्कॉस्ड वेरिएबल (या ऑब्जेक्ट) के लिए उपलब्ध होना चाहिए। मैंने निम्नलिखित फ़ंक्शन की कोशिश की, लेकिन किसी कारण से, मुझे कंसोल के लिए undefined मुद्रित किया गया …

 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" <------ 

मुझे यह समझने में परेशानी हो रही है कि कोड ऊपर टूट जाता है … उस मॉडल का एक बहुत सरल प्रोटोटाइप काम करता है …

 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" <---- 

क्या कोई मुझे समझने में मदद करता है कि try_this() क्यों काम करता है, और run_cmd() नहीं करता है? FWIW, मुझे child_process.spawn का उपयोग करने की आवश्यकता है, क्योंकि child_process.exec में 200KB बफर सीमा है।

बाल्टी पुरस्कार

मैंने अभी तक कोई सफलता के साथ पहला जवाब नहीं दिया …

 // 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' 

बोनस को उस व्यक्ति को सम्मानित किया जाएगा जो मेरे मौजूदा कोड में गलत हो सकता है, जैसे कि मैं foo = new run_cmd('netstat.exe', ['-an'], function (me, data){me.stdout=data;}); और foo.stdout में आउटपुट प्राप्त करें (वैश्विक चर foo.stdout में)

अंतिम संकल्प

मैं जेम्स व्हाइट का जवाब स्वीकार करता हूं, लेकिन यह मेरे लिए काम करने वाला सटीक कोड है …

 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 me.stdout = ""; 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); 

वेब के समाधान से एकत्रित समाधान "node.js शेल कमांड निष्पादन"

यहां तीन मुद्दे हैं जिन्हें तय करने की जरूरत है:

सबसे पहले यह है कि आप stdout को एसिंक्रोनस का उपयोग करते समय तुल्यकालिक व्यवहार की अपेक्षा कर रहे हैं। आपके run_cmd फ़ंक्शन में सभी कॉल्स अतुल्यकालिक हैं, इसलिए यह बच्चा प्रक्रिया को पैदा करेगा और तुरंत, चाहे कुछ, सब, या कोई भी डेटा stdout से नहीं पढ़ा गया हो, चाहे तुरंत ही लौटाए। जैसे, जब आप चलाते हैं

 console.log(foo.stdout); 

आप इस समय foo.stdout में संग्रहीत होने वाले कुछ भी हो सकते हैं, और इसमें कोई गारंटी नहीं है कि आपके बच्चे की प्रक्रिया अभी भी चल रही होगी।

दूसरा यह है कि stdout एक पठनीय धारा है , इसलिए 1) डेटा इवेंट को कई बार कहा जा सकता है, और 2) कॉलबैक को बफर दिया जाता है, स्ट्रिंग नहीं। उपाय करने में आसान; बस बदल दो

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

में

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

ताकि हम अपने बफर को एक स्ट्रिंग में कनवर्ट कर सकें और उस स्ट्रिंग को हमारे स्टडआउट चर में जोड़ दें।

तीसरा यह है कि आप केवल यह जान सकते हैं कि जब आप 'एंड' ईवेंट प्राप्त करते हैं तो आपको सभी आउटपुट प्राप्त हुए हैं, जिसका अर्थ है कि हमें एक और श्रोता और कॉलबैक चाहिए:

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

तो, आपका अंतिम परिणाम यह है:

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

स्वीकृत उत्तर (तीसरे बिंदु) का एक सरलीकृत संस्करण, बस मेरे लिए काम किया

 function run_cmd(cmd, args, callBack ) { var spawn = require('child_process').spawn; var child = spawn(cmd, args); var resp = ""; child.stdout.on('data', function (buffer) { resp += buffer.toString() }); child.stdout.on('end', function() { callBack (resp) }); } // () 

उपयोग:

 run_cmd( "ls", ["-l"], function(text) { console.log (text) }); run_cmd( "hostname", [], function(text) { console.log (text) }); 

सरल तरीके से सिर्फ शेलजेएस लिब का उपयोग करना है …

 $ npm install [-g] shelljs 

EXEC उदाहरण:

 require('shelljs/global'); // Sync call to exec() var version = exec('node --version', {silent:true}).output; // Async call to exec() exec('netstat.exe -an', function(status, output) { console.log('Exit status:', status); console.log('Program output:', output); }); 

ShellJs.org कई आम शैल आदेशों के साथ नोडजेएस फ़ंक्शंस के रूप में मैप करने का समर्थन करता है:

  • बिल्ली
  • सीडी
  • chmod
  • cp
  • dirs
  • गूंज
  • कार्यकारी
  • बाहर जाएं
  • खोज
  • ग्रेप
  • ln
  • ls
  • mkdir
  • mv
  • popd
  • pushd
  • लोक निर्माण विभाग
  • rm
  • एसईडी
  • परीक्षा
  • कौन कौन से

मैं इसे और अधिक संक्षेप में इस्तेमाल किया:

 var sys = require('sys') var exec = require('child_process').exec; function puts(error, stdout, stderr) { sys.puts(stdout) } exec("ls -la", puts); 

यह पूरी तरह से काम करता है 🙂

मुझे एक ऐसी ही समस्या थी और मैंने इसके लिए एक नोड एक्सटेंशन लिखना समाप्त कर दिया। आप जीआईटी रिपॉजिटरी देख सकते हैं यह खुला स्रोत और मुफ़्त है और यह सब अच्छी चीजें है!

https://github.com/aponxi/npm-execxi

ExecXI एक नोड एक्सटेंशन है जिसे C ++ में लिखे गए हैं ताकि शेल कमांड को एक-एक करके निष्पादित किया जा सके, वास्तविक समय में कंसोल में कमांड की आउटपुट को आउटपुट किया जाये। वैकल्पिक जंजीर और अनकहा तरीके मौजूद हैं; जिसका अर्थ है कि आप कमांड (श्रृंखले) के बाद स्क्रिप्ट रोकना चुन सकते हैं, या आप जारी रख सकते हैं यदि कुछ नहीं हुआ है!

उपयोग निर्देश रीडई फ़ाइल में हैं पुल अनुरोध बनाने या मुद्दों को सबमिट करने के लिए स्वतंत्र महसूस करें!

मैंने सोचा था कि यह उल्लेख करने के लिए लायक था।

@ टोनीओ'हगन, जवाब देने योग्य shelljs जवाब है, लेकिन, मैं उनके जवाब के तुल्यकालिक संस्करण को उजागर करना चाहूंगा:

 var shell = require('shelljs'); var output = shell.exec('netstat -rn', {silent:true}).output; console.log(output); 

तुल्यकालिक एक-लाइनर:

require('child_process').execSync("echo 'hi'", function puts(error, stdout, stderr) { console.log(stdout) });

आपके run_cmd फ़ंक्शन में एक चरम विरोधाभास है:

  var me = this; child.stdout.on('data', function(me, data) { // me is overriden by function argument cb(me, data); }); 

बस इसे इस पर बदलें:

  var me = this; child.stdout.on('data', function(data) { // One argument only! cb(me, data); }); 

त्रुटियों को हमेशा यह जोड़ने के लिए:

  child.stderr.on('data', function(data) { console.log( data ); }); 

संपादित करें आप कोड विफल होते हैं क्योंकि आप dir चलाने की कोशिश कर रहे हैं जो एक अलग स्टैंडअलोन प्रोग्राम के रूप में प्रदान नहीं किया गया है। यह cmd प्रक्रिया में एक कमांड है यदि आप फ़ाइल सिस्टम के साथ चलाना चाहते हैं तो मूल require( 'fs' )

वैकल्पिक रूप से (जो मैं सुझा नहीं है) आप बैच फ़ाइल बना सकते हैं जिसे आप चला सकते हैं। नोट करें कि डिफ़ॉल्ट रूप से ओएस cmd माध्यम से बैच फाइलों में आग लगाते हैं।

आप वास्तव में अपने run_cmd फ़ंक्शन से कुछ भी नहीं लौट रहे हैं

 function run_cmd(cmd, args, done) { var spawn = require("child_process").spawn; var child = spawn(cmd, args); var result = { stdout: "" }; child.stdout.on("data", function (data) { result.stdout += data; }); child.stdout.on("end", function () { done(); }); return result; } > foo = run_cmd("ls", ["-al"], function () { console.log("done!"); }); { stdout: '' } done! > foo.stdout 'total 28520...' 

सिर्फ ठीक काम करता है 🙂