2009-09-17 5 views
6

मैं एक जेस्क्रिप्ट प्रोग्राम लिख रहा हूं जो cscript.exe में चलाया जाता है। क्या स्क्रिप्ट के भीतर से कमांड लाइन कमांड चलाने के लिए संभव है। यह वास्तव में नौकरी को आसान बना देगा, क्योंकि मैं एक ही काम करने के लिए जेएसक्रिप्ट में अधिक कोड लिखने के बजाय कुछ आदेश चला सकता हूं।क्या विंडोज स्क्रिप्टिंग होस्ट (डब्ल्यूएसएच) cscript.exe में जेस्क्रिप्ट (जावास्क्रिप्ट नहीं) से कमांड लाइन कमांड चलाने का कोई तरीका है?


उदाहरण के लिए: आदेश 10 सेकंड के लिए एक कुंजी दबाने के लिए प्रतीक्षा करने में, मैं सीधे टाइमआउट आदेश

timeout /t 10 

को लागू करने jscript में इसका मतलब है अधिक काम इस्तेमाल कर सकते हैं। बीटीडब्ल्यू, मैं विस्टा और डब्ल्यूएसएच v5.7

पर कोई विचार है? thanx!

उत्तर

8

आप डॉस WshShell.Run पद्धति का उपयोग करके आदेश पर अमल कर सकते हैं:

var oShell = WScript.CreateObject("WScript.Shell"); 
oShell.Run("timeout /t 10", 1 /* SW_SHOWNORMAL */, true /* bWaitOnReturn */); 


आप विशेष रूप से स्क्रिप्ट निष्पादन को रोकने के लिए जब तक एक कुंजी दबाने या एक समय बीत जाने की जरूरत है, तो आप को पूरा कर सकते यह WshShell.Popup विधि (एक टाइमआउट विकल्प वाला एक संवाद बॉक्स) का उपयोग करके:

var oShell = WScript.CreateObject("WScript.Shell"); 
oShell.Popup("Click OK to continue.", 10); 

हालांकि, यह विधि cscript के अंतर्गत चलते समय एक संदेश बॉक्स प्रदर्शित करती है।

इस आलेख में एक अन्य संभावित दृष्टिकोण का वर्णन किया गया है: How Can I Pause a Script and Then Resume It When a User Presses a Key on the Keyboard? संक्षेप में, आप इनपुट स्ट्रीम से सीधे पढ़ने के लिए WScript.StdIn संपत्ति का उपयोग कर सकते हैं और इस तरह इनपुट के लिए प्रतीक्षा कर सकते हैं। हालांकि, इनपुट स्ट्रीम से पढ़ने से टाइमआउट का समर्थन नहीं होता है और केवल ENTER कुंजी प्रेस (कोई भी कुंजी नहीं) पर लौटाता है। वैसे भी, यहाँ एक उदाहरण है, बस मामले में: मदद ppl के लिए

WScript.Echo("Press the ENTER key to continue..."); 

while (! WScript.StdIn.AtEndOfLine) { 
    WScript.StdIn.Read(1); 
} 
+0

जो काम करता है! thanx – detj

1

thanx, यह था मेरा पहला पोस्ट और stackoverflow बेहतरीन है! इसके अलावा, मैंने oShell.SendKeys() विधि का उपयोग करके, इस बात को करने का एक और तरीका निकाला।

var oShell = WScript.CreateObject("WScript.Shell"); 
oShell.SendKeys("cls{enter}timeout /t 10{enter}"); 

इस तरह से आप चला सकते हैं एक नई प्रक्रिया या खिड़की

संपादित को उत्पन्न करने के बिना लगभग हर डॉस कमान:
यहाँ कैसा है हालांकि यह समस्या को हल करने लगता है, इस कोड को बहुत विश्वसनीय नहीं है। नीचे दी गई टिप्पणियां देखें

+0

आपकी SendKeys स्ट्रिंग गलत है - यह "cls {enter} timeout/t 10 {enter}" (प्लस के बिना) होना चाहिए। – Helen

+0

इसके अलावा, आपका संस्करण बहुत अविश्वसनीय है। सबसे पहले, 'SendKeys' सक्रिय विंडो में कीस्ट्रोक भेजता है, इसलिए इनपुट को दूसरी विंडो में भेजा जा सकता है जिसे गलती से सक्रिय किया गया है। साथ ही, यदि 'SendKeys' के बाद कमांड हैं, तो वे' SendKeys' के बाद निष्पादित नहीं होंगे। 'SendKeys' से पहले और बाद में' WScript.Echo' कमांड डालने का प्रयास करें और इनपुट स्ट्रिंग से 'cls' को हटाएं - और आप देखेंगे कि स्क्रिप्ट आउटपुट गड़बड़ हो गया है और' टाइमआउट 'कमांड को आखिरकार निष्पादित किया गया है। – Helen

+0

हाँ .. यह कोड वास्तव में गन्दा है!मैंने कोड के बाकी हिस्सों के साथ इसे चलाने के बाद समस्याओं का सामना करना शुरू कर दिया और यह सच है कि SendKeys के साथ, बयान आवश्यक रूप से निष्पादित नहीं होते हैं। यदि आपके पास SendKeys() के साथ WScript.StdIn.Readline() है, तो यह और भी बदतर हो जाता है, क्योंकि यह उपयोगकर्ता को कोज़ इनपुट करने की प्रतीक्षा नहीं करेगा, यह पहले से ही SendKeys से इनपुट प्राप्त कर रहा है और यह चीजों को खराब तरीके से तोड़ देता है! सबक सीखा: SendKeys के साथ बहुत सावधान रहें, यह मैला महान अंतर्दृष्टि हेलेन हो सकता है! – detj

संबंधित मुद्दे