2012-12-12 20 views
6

मुझे लगता है कि यह संभव है न, लेकिन मैं उपयोग कर रहा है:कमांड लाइन में उपयोगकर्ता इनपुट;

Process p = Runtime.getRuntime().exec(command); 

कमांड लाइन पर आदेशों को चलाने के लिए, लेकिन अब मैं एक स्थिति करवाते आए हैं जहां आदेश मैं भाग रास्ता चला रहा हूँ के माध्यम से के लिए पूछेंगे कुछ उपयोगकर्ता इनपुट, उदाहरण के लिए एक उपयोगकर्ता नाम।

इसे निष्पादित करने वाले आदेश के लिए तर्क द्वारा हल नहीं किया जा सकता है, क्या कोई तरीका है कि मैं उपयोगकर्ता नाम को उसी कमांड लाइन इंस्टेंस में पास कर सकता हूं और जारी रख सकता हूं?

--- संपादित करें ---

मैं अभी भी नहीं कर सकते यह काम करने के लिए मिलता है। कमांड लाइन पर ये चरण हैं:

C:\someProgram.exe 
Login: 
Passowrd: 

इसलिए मुझे रनटाइम पर संकेत मिलने पर लॉगिन और पासवर्ड पास करने की आवश्यकता है।

try { 
     String CMD = "\"C:\\someProgram\""; 
     Scanner scan = new Scanner(System.in); 
     ProcessBuilder builder = new ProcessBuilder(CMD); 
     builder.redirectErrorStream(true); 
     Process process = builder.start(); 

     InputStream is = process.getInputStream(); 
     BufferedReader reader = new BufferedReader (new InputStreamReader(is)); 
     OutputStream out = process.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); 
     String line; 
     try { 
      while (scan.hasNext()) { 
       String input = scan.nextLine(); 
       if (input.toLowerCase().startsWith("login")) { 
        writer.write("myUsername"); 
       } else if(input.toLowerCase().startsWith("password")){ 
        writer.write("myPassword"); 
       } 
       writer.flush(); 

       line = reader.readLine(); 
       while (line != null) { 
        System.out.println ("Stdout: " + line); 
        line = reader.readLine(); 
       } 
       if (line == null) { 
        break; 
       } 
      } 
      process.waitFor(); 
     } 
     finally {; 
      writer.close(); 
      reader.close(); 
     } 
    } 
    catch (Exception err) { 
     System.err.println("some message"); 
    } 

Ive तरह बातें करने की कोशिश की: कोड मैं यह does not काम मिल गया है writer.write ("myUsername \ n");

कोई मदद, मैं देख सकता हूं कि कुछ प्रोग्राम्स.एक्सई को प्रक्रियाओं में बुलाया जाता है और चल रहा है, लेकिन यह बस लटकता है।

+0

क्या आपने जांच की है कि 'प्रक्रिया' के पास ऐसा करने के लिए कोई तरीका है या नहीं? –

+0

हाँ, उदाहरण के लिए प्रक्रिया # getOutputStream() :) – hoaz

उत्तर

2

बस p.getOutputStream() पर लिखें। वह उपयोगकर्ता नाम को प्रक्रिया के मानक इनपुट में भेज देगा, जो आपको चाहिए जो करना चाहिए।

out = p.getOutputStream(); 
out.write("fooUsername\n".getBytes()); 
out.flush(); 
0

आपको कमांड इनपुट को रीडायरेक्ट करना चाहिए और वहां अपने पैरामीटर भेजना चाहिए। process.setInputStream() का उपयोग करें, इस स्ट्रीम में लिखें।

+1

कोई प्रक्रिया नहीं है .setInputStream() – hoaz

0

भाग के रूप में अपने command स्ट्रिंग, अगर आप और शायद PowerShell पर यूनिक्स/लिनक्स/OSX चल रहे हैं, तो आप cat शेल कमांड पहले जोड़ें सकता है खोल अपने अभीष्ट के लिए इनपुट धारा में एक फ़ाइल की सामग्री को डंप करने के लिए इनपुट के रूप में पढ़ने के लिए निष्पादन योग्य।

ए कमांड cat user_input.txt | myAppWantsInput.pl जैसे कुछ आदेश।

यह user_input.txt की सामग्री ले जाएगा मानक-इन में डंप है, इसलिए जब "myAppWantsInput.pl" अपने command कार्यान्वित में, और से मानक-इन करें, फ़ाइल की सामग्री पढ़ने किया जाएगा और उस लेने पढ़ता इनपुट के रूप में जैसे कुंजीपटल से दर्ज किया गया है।

बेशक, आपको एक प्राथमिक पता नहीं है कि आप किस मूल्य को पारित करना चाहते हैं, आप कमांड को आमंत्रित करने से पहले उन फ़ाइलों को उत्पन्न कर सकते हैं जिन्हें आप गतिशील रूप से आवश्यक हैं। यह काम नहीं करेगा अगर आप कमांड चलाने से पहले जो इनपुट चाहते हैं उसे निर्धारित नहीं कर सकते हैं।

+0

मुझे लगता है कि वह प्रोसेस इंस्टेंस में इनपुट भेजना चाहता है, न कि जावा वीएम जो इसे चला रहा है। – javawizard

+1

@javawizard I किसी कारण से माना जाता है कि उसका आदेश एक और जावा ऐप शुरू कर रहा था, मैंने अपना जवाब अधिक सामान्य होने के लिए अपडेट किया है। कमांड के निष्पादन योग्य के कार्यान्वयन के बावजूद मेरे दृष्टिकोण को काम करना चाहिए। – ArtB