2010-01-27 8 views
14

के साथ निष्पादित करें मुझे जावा में बैच फ़ाइल निष्पादित करने में कठिनाई हो रही है जो पैरामीटर की अपेक्षा करता है। इन पैरामीटर में रिक्त स्थान हो सकते हैं इसलिए मुझे उन्हें उद्धरणों में लपेटने की आवश्यकता है। मुझे लिनक्स के लिए भी वही काम करने की आवश्यकता होगी क्योंकि कुछ पैरामीटर में ! जैसे विशेष वर्ण हो सकते हैं।पैरामीटर

नॉन-फंक्शनल विंडोज कोड:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "\"mybat.bat\"", 
     "\"param 1\"", 
     "\"param 2\"", 
     "\"param 3\"" 
     );  

नॉन-फंक्शनल लिनक्स कोड:

ProcessBuilder pb = new ProcessBuilder(
     "bash", 
     "-c", 
     "'myshellscript.sh'", 
     "'param 1'", 
     "'param 2'", 
     "'param 3'" 
     ); 

मैं समझता हूँ कि मैं नीचे Windows उदाहरण की तरह पैरामीटर जोड़कर किया जाना चाहिए, लेकिन यह नहीं होगा रिक्त स्थान के साथ काम करें:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "mybat.bat param 1 param 2 param 3" 
     ); 

यह कैसे किया जाना चाहिए?

+0

आपको लगता है कि सही कारण के लिए उद्धरण के भीतर उन्हें लगा नहीं था? आप इसे अपने आखिरी स्निपेट के लिए क्यों नहीं कर रहे हैं? – zneak

+0

मैं पहले दो स्निपेट्स को काम करने की कोशिश कर रहा हूं। तीसरा स्निपेट mybat.bat पर 6 पैरामीटर पास करेगा जब मैं केवल तीन की तलाश में हूं। –

उत्तर

17

विंडोज:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", "/c", "mybat.bat", 
     "param 1", "param 2", "param 3"); 

यूनिक्स:

ProcessBuilder pb = new ProcessBuilder(
     "sh", "mybat.sh", 
     "param 1", "param 2", "param 3"); 
+0

मैंने कोशिश की, यह काम करता है !!! –

+1

यह क्यों हो रहा है? java.io.IOException: java.io.IOException: sh: java.lang.UNIXProcess पर नहीं मिला। (UNIXProcess.java:148) java.lang.ProcessImpl.start (ProcessImpl.java:65) पर java.lang.ProcessBuilder.start (ProcessBuilder.java:451) पर DmMdbConsumer.migrateData (DmMdbConsumer.java:328) पर Jm.dang.Thread.run (थ्रेड। पर DmMdbConsumer.run (DmMdbConsumer.java3030)।जावा: 5 9 5) –

+0

"श" को मेरे मामले में "/ bin/sh" होना था। धन्यवाद! –

5

नहीं, आपको * nix पर तर्क उद्धृत करना चाहिए। शैल को गलत तरीके से परिभाषित करने से रोकने के लिए एक इंटरैक्टिव शैल में * निक्स पर उद्धरण आवश्यक है, लेकिन जब प्रक्रिया को लॉन्च करते समय सीधे एक खोल शामिल नहीं होता है। इसलिए उद्धरण की कोई आवश्यकता नहीं है।

यदि आप उद्धरण शामिल करते हैं, तो लॉन्च की गई प्रक्रिया उन्हें इनकमिंग तर्कों के हिस्से के रूप में दिखाई देगी और उदाहरण के लिए (उदाहरण के लिए) उद्धरण वाले फ़ाइल नामों को खोलने का प्रयास करें।

आप भी "-c" तर्क को बाश नहीं करना चाहते हैं। यह अगली तर्क को कमांड लाइन के रूप में पार्स करने के लिए कहता है, लेकिन आप तर्कों की एक सूची की आपूर्ति कर रहे हैं। "-c" विकल्प और अतिरिक्त उद्धरण निकालें और इसे काम करना चाहिए।

उचित लिनक्स कॉल होगा:

ProcessBuilder pb = new ProcessBuilder(
    "bash", 
    "myshellscript.sh", 
    "param 1", 
    "param 2", 
    "param 3" 
    ); 

भी नहीं है कि अगर फ़ाइल "myshellscript.sh" निष्पादन योग्य है और उचित कुटिया लाइन है (उदाहरण के लिए "#/bin/bash!"), आप "बैश" तर्क की आवश्यकता नहीं है। यह प्राथमिक है क्योंकि यदि स्क्रिप्ट को कभी भी एक अलग भाषा में लिखे गए एक के साथ बदल दिया जाता है तो आपको अपने कॉलिंग ऐप को अपडेट नहीं करना होगा।

इसी प्रकार, विंडोज़ पर, आपको "cmd" और "/ c" तर्कों की आवश्यकता नहीं होनी चाहिए। प्रक्रिया लॉन्चर/ओएस को स्वचालित रूप से बैच फ़ाइल (एक्सटेंशन के आधार पर) लॉन्च करना चाहिए।

+0

दुर्भाग्य से मुझे विंडोज़ के लिए cmd और/c की आवश्यकता है। मेरी शेल स्क्रिप्ट में शेबांग लाइन है, लेकिन मैं इसे बिना या बिना काम करने के लिए प्राप्त कर सकता हूं। –