2012-08-25 21 views
8

मैं ProcessBuilder का उपयोग कर निम्न आदेश का निर्माण करने की जरूरत है कमांड लाइन करने के लिए अतिरिक्त उद्धरण कहते हैंProcessBuilder

ArrayList<String> test = new ArrayList<String>(); 
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\""); 
test.add("/enable \"My USB Device\""); 

ProcessBuilder processBuilder = new ProcessBuilder(test);      
processBuilder.start().waitFor(); 

हालांकि, इस प्रणाली के लिए निम्न गुजरता (Sysinternals प्रक्रिया मॉनिटर का उपयोग कर सत्यापित)

"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device"" 

से पहले उद्धरण नोट करेंऔर Device के बाद दो उद्धरण। मुझे उन अतिरिक्त उद्धरणों से छुटकारा पाना होगा क्योंकि वे आमंत्रण विफल कर देते हैं। क्या किसी को भी यह करना आता है?

+0

अच्छा अवलोकन! क्या कोई दस्तावेज है जो वर्णन करता है कि ProcessBuilder डबल कोट्स के साथ हर तर्क उद्धृत करता है? – okwap

उत्तर

8

जहां तक ​​मैं समझता हूं, क्योंकि प्रोसेसबिल्डर को यह नहीं पता है कि कमांड को पैरामीटर कैसे पास किए जाएंगे, आपको प्रोसेसबिल्डर को अलग-अलग पैरामीटर पारित करने होंगे;

ArrayList<String> test = new ArrayList<String>(); 
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\""); 
test.add("/enable"); 
test.add("\"My USB Device\""); 
+0

धन्यवाद जोआचिम, आप सही हैं। अतिरिक्त उद्धरण प्राप्त करने का कारण सक्षम है और "मेरा ..." के बीच की जगह है। इसे काम करने की तरह आप इसे विभाजित करना। जैसा कि मैंने एक एक्सएमएल फ़ाइल से पूर्ण कमांड पढ़ा है, पार्सिंग अब थोड़ा और जटिल हो गया है, लेकिन यह एक और कहानी है ;-) –

3

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

ArrayList<String> test = new ArrayList<String>(); 
test.add("C:\\Program Files\\USBDeview\\USBDeview.exe"); 
test.add("/enable"); 
test.add("My USB Device"); 

उद्धरण आदेश cmd पार्सर कैसे बहस में शब्द को तोड़ने के लिए बताने के लिए कमांड लाइन पर जरूरी हैं, लेकिन क्योंकि यह पहले से ही तर्क दिया गया है पूर्व विभाजन ProcessBuilder उन्हें जरूरत नहीं है।

10

जोआचिम सही है, लेकिन जब आपके प्रक्रिया नीचे के रूप में तर्क एकीकृत उम्मीद उसके जवाब के लिए अपर्याप्त है:

myProcess.exe /myParameter="my value" 

के रूप में स्टीफन द्वारा देखा, ProcessBuilder अपने तर्क में रिक्त स्थान देख सकते हैं और उद्धरण में लपेट, इस तरह होगा:

myProcess.exe "/myParameter="my value"" 

पैरामीटर मान ऊपर तोड़कर रूप जोआचिम /myparameter= और "my value" के बीच एक रिक्ति है, जो पैरामीटर के इस प्रकार के लिए काम नहीं करेगा में परिणाम होगा की सिफारिश की:

myProcess.exe /myParameter= "my value" 

सूर्य के अनुसार, उनके infinite wisdom में, यह नहीं एक बग और डबल कोट्स can be escaped वांछित व्यवहार प्राप्त करने के लिए है।

तो अंत में स्टीफन के सवाल का जवाब देने, इस एक विकल्प है कि काम करना चाहिए, यदि प्रक्रिया आप बुला रहे हैं चीजों को सही ढंग से करता है:

ArrayList<String> test = new ArrayList<String>(); 
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\""); 
test.add("/enable \\\"My USB Device\\\""); 

यह आपको आदेश "C:\Program Files\USBDeview\USBDeview.exe" "/enable \"My USB Device\"", जो काम कर सकता है देना चाहिए; YMMV।

+1

क्या आपने कभी एक आधिकारिक संदर्भ पाया है जिसमें कहा गया है कि प्रोसेसबिल्डर "आपके तर्क में रिक्त स्थान देखेगा और उद्धरण के साथ लपेटेगा "?मैं पुष्टि कर सकता हूं कि मेरे परीक्षण से, लेकिन, यह पागल है कि जावाडॉक कभी भी यह नहीं कहता है कि (या कम से कम कोई भी जो मुझे मिल सकता है)। अच्छा उत्तर! – mateuscb