2012-10-01 27 views
7

मैं विंडोज स्क्रिप्ट (.vbs) का उपयोग कर कमांड लाइन (cmd.exe) से एक साधारण कमांड का परिणाम प्राप्त करना चाहता हूं। यह कैसे किया जाता है? मैं एक अच्छा/सरल उदाहरण या स्पष्टीकरण खोजने में सक्षम नहीं हूं। उदाहरण के साथ आप "दिनांक" या "समय" कमांड का उपयोग कर सकते हैं। जैसे:vbs कमांड लाइन कमांड से परिणाम कैसे प्राप्त करें

enter image description here

पी.एस. मैं स्क्रिप्ट कोड लिखने में सक्षम हूं जो cmd.exe खोलता है और कमांड भेजता है।

धन्यवाद!

+0

प्लस 1 क्योंकि आरेख अद्भुत है: o –

उत्तर

10

संदेह में, documentation पढ़ें।

Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t") 
Do While p.Status = 0 
    WScript.Sleep 100 
Loop 
WScript.Echo p.StdOut.ReadAll 

संपादित करें:: आप शायद कुछ इस तरह चाहते जब Exec() का उपयोग कर आप इनपुट .StdIn वर्णनकर्ता के माध्यम से, SendKeys() के माध्यम से नहीं गुजरती हैं (जो वैसे भी इनपुट पास करने का एक नहीं बल्कि अविश्वसनीय तरीका है)।

%COMSPEC%cmd.exe का पूर्ण पथ और /c विकल्प के साथ एक सिस्टम वातावरण चर रहा है आदेश (उदाहरण में date /t) समाप्त हो गया है के बाद cmd.exe बाहर निकलें बनाता है।

यदि आदेश निकास कोड के साथ सफलता/विफलता इंगित करता है, तो आप आदेश समाप्त होने के बाद ExitCode संपत्ति देख सकते हैं।

If p.Status <> 0 Then WScript.Echo p.ExitCode 

EDIT2: के बजाय atprogram सहभागी उपयोग कर, आप commandlines कि उपयोगकर्ता सहभागिता के बिना विशेष कार्यों प्रदर्शन करेंगे निर्माण कर सकते हैं? साथ इस तरह गैर-सहभागी commandlines कुछ काम कर सकते हैं:

prompt = "C:\>" 
atprogram_cmdline_1 = "atprogram.exe ..." 
atprogram_cmdline_2 = "atprogram.exe ..." 
'... 

Function ReadOutput(p) 
    text = "" 
    Do Until Right(text, Len(prompt)) = prompt 
    text = text & p.StdOut.Read(1) 
    Loop 
    ReadOutput = text 
End Function 

Set cmd = CreateObject("WScript.Shell").Exec("%COMSPEC% /k") 
ReadOutput cmd ' skip over first prompt 

cmd.StdIn.WriteLine(atprogram_cmdline_1) 
WScript.Echo ReadOutput(cmd) 
cmd.StdIn.WriteLine(atprogram_cmdline_2) 
WScript.Echo ReadOutput(cmd) 
'... 

cmd.Terminate ' exit CMD.EXE 

%COMSPEC% /k एक कमांड चलने के बिना एक कमांड प्रॉम्प्ट spawns। /k इसे बंद होने से रोकता है। चूंकि यह स्वचालित रूप से बंद नहीं हो रहा है, इसलिए आप यहां While p.Status = 0 लूप का उपयोग नहीं कर सकते हैं। यदि किसी आदेश को समाप्त करने के लिए कुछ समय चाहिए, तो आपको WScript.Sleep कई सेकंड की आवश्यकता है।

cmd.StdIn.WriteLine के माध्यम से आप CMD उदाहरण में कमांडलाइन चला सकते हैं। फ़ंक्शन ReadOutput() अगली प्रॉम्प्ट दिखाई देने तक StdOut से आउटपुट पढ़ता है। आपको प्रॉम्प्ट की तलाश करनी होगी, क्योंकि पढ़ना ऑपरेशन अवरुद्ध हो रहा है, इसलिए आप बस "अभी तक मुद्रित किए गए सभी को पढ़ सकते हैं" नहीं कह सकते हैं।

समाप्त होने के बाद आप cmd.Terminate के माध्यम से छोड़ दें।

+0

ठीक है कि काम करता है, धन्यवाद, लेकिन मुझे लगता है कि मैं इस तरह के एक सुव्यवस्थित उत्तर की उम्मीद नहीं कर रहा था। मैं बस समझाऊंगा कि मैं क्या करने की कोशिश कर रहा हूं। मैं कुछ चिप्स प्रोग्राम करने के लिए एटमेल कमांड लाइन आधारित प्रोग्रामिंग का उपयोग करना चाहता हूं। यह उपयोग करना वास्तव में आसान है और अच्छी तरह से काम करता है। मैं कमांड खोलने में सक्षम हूं और इसे SendKeys का उपयोग करके कमांड भेजता हूं, लेकिन जब मैं एक्सेक का उपयोग करके कमांड को शामिल करने का प्रयास करता हूं तो यह विंडो को लाता है लेकिन कमांड नहीं डालता है। वास्तव में "/ सी" क्या कर रहा है? क्या आदेश का आउटपुट प्राप्त करने का कोई और तरीका है? मुझे यह जानने का एक तरीका चाहिए कि प्रोग्रामिंग सफल है या नहीं। – user1387865

+0

मदद के लिए धन्यवाद! मैं इसकी सराहना करता हूं। मैं अभी तक सफल नहीं हुआ हूं। किसी कारण से, जब मैं Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c atprogram") भेजता हूं तो यह "एटप्रोग्राम" कमांड दर्ज किए बिना टर्मिनल खोलता है।मैंने कई चीजों की कोशिश की है लेकिन यह सिर्फ आदेश नहीं चलाएगा। मुझे लगता है कि मुझे SendKeys का उपयोग करने के लिए मजबूर किया गया है, लेकिन तब तक मैं आउटपुट नहीं देख सकता जब तक कि मैं टर्मिनल विंडो को नहीं खोलता। – user1387865